用一个二维数组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);
}


京公网安备 11010502036488号