直接找答案会超内存;
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;
}

京公网安备 11010502036488号