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