直接找答案会超内存;
dp[i][j][k]表示到达第i个点时,已经工作j天,连续工作了k天
如果当前为0
dp[i][j][0]=min(dp[i][j][0],dp[i-1][j][k])
为1
dp[i][j][k]=min(dp[i][j][k],dp[i-1][j-1][k-1]+1)
当k==0时,dp[i][j][0]=min(dp[i][j][0],dp[i-1][j][k])
这样开数组也会MLE,就降维;
#include<bits/stdc++.h> using namespace std; int a[1000010],dp[500][500],n;//前i天,工作了j天 char ch[600]; int main() { int tag=0; cin>>n>>tag; cin>>(ch+1); memset(dp,0x3f,sizeof(dp)); dp[0][0]=0; for(int i=1;i<=n;i++) { for(int j=i;j>=1;j--) { for(int k=j;k>=1;k--)//顺序无所谓 { dp[j][0]=min(dp[j][0],dp[j][k]); if(ch[i]=='1') dp[j][k]=min(dp[j][k],dp[j-1][k-1]+k); } } } int max1=0; for(int i=1;i<=n;i++) { for(int j=0;j<=i;j++) if(dp[i][j]<=tag){ max1=max(max1,i); } } cout<<max1; }