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 i1长度的前缀且第 i − 1 i-1 i1是否为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),in,jm,k1

时间复杂度: 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 统计优美子数组

[LeetCode] 898. Bitwise ORs of Subarrays 子数组按位或操作

Leetcode-930 Binary Subarrays With Sum(和相同的二元子数组)