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