用一个二维数组dp[i][j]来表示工作i天,连续工作j天
那么得到状态转移方程dp[i][j]=(dp[i-1][j-1])+j (如果当前字符为'1')
最终只要遍历dp数组,找到最长天数ans(并且它满足dp[i][j]<=K,即题目中说的总体力消耗不超过K)

#include <bits/stdc++.h>
using namespace std;
int dp[410][410];
const int INF=0x3f3f3f3f;
char s[410];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    cin>>s+1;
    memset(dp,INF,sizeof(dp));
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j;j--)
        {
            for(int k=j;k;k--)
            {
                dp[j][0]=min(dp[j][k],dp[j][0]);
                if(s[i]=='1') dp[j][k]=min(dp[j][k],dp[j-1][k-1]+k);
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(dp[i][j]<=m) ans=i;
        }
    }
    printf("%d\n",ans);
}