F - Erase Subarrays(01子序列dp)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F - Erase Subarrays(01子序列dp)相关的知识,希望对你有一定的参考价值。
F - Erase Subarrays(01子序列dp)
转化为子序列问题,可以理解为01子序列,1就是选,0就是不选。
然后当前选不选的状态递推 由前 i − 1 i-1 i−1长度的前缀且第 i − 1 i-1 i−1是否为1决定,因此可以开个三维数组 d p ( i , j , k ) , i ≤ n , j ≤ m , k ≤ 1 dp(i,j,k), i\\le n,j\\le m,k\\le1 dp(i,j,k),i≤n,j≤m,k≤1
时间复杂度: O ( n m ) O(nm) O(nm)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=3030;
const int INF=0x3f3f3f3f;
int dp[maxn][maxn][2];
int main(void)
int N,M;cin>>N>>M;
memset(dp,INF,sizeof(dp));
dp[0][0][1]=0;
for(int i=1;i<=N;i++)
int x;scanf("%d",&x);
for(int j=0;j<=M;j++)
dp[i][j][0]=min(dp[i-1][j][1]+1,dp[i-1][j][0]);
if(j>=x)dp[i][j][1]=min(dp[i-1][j-x][1],dp[i-1][j-x][0]);
for(int i=1;i<=M;i++)
int res=min(dp[N][i][1],dp[N][i][0]);
if(res==INF)puts("-1");
else printf("%d\\n",res);
return 0;
以上是关于F - Erase Subarrays(01子序列dp)的主要内容,如果未能解决你的问题,请参考以下文章
子序列的按位或 Bitwise ORs of Subarrays
agc037_f Counting of Subarrays
Codeforces 1398C. Good Subarrays(前缀+思维)
[LeetCode] 1248. Count Number of Nice Subarrays 统计优美子数组