- 题意:给你n和k,和一个长度为n的字符串,字符串中的0表示休息,1表示工作,连续工作会损耗连续的体力值,从1开始,但是休息后就重新计算体力值,一共最多损耗k点体力值,求解最多工作多少天
- 题解:动态规划,状态定义为,dp[j][k]表示在第i天之前工作j天,并且已经连续工作k天的情况下的最小体力花费,最后扫一遍,保存满足条件的j的最大值即可,转移过程很好理解。
- https://ac.nowcoder.com/acm/contest/328/B
#include<iostream>
#include<string.h>
#include<cmath>
#include<stdio.h>
using namespace std;
#define inf 0x3f3f3f3f
int dp[505][505];
char s[505];
int main()
{
int n,m;
scanf("%d%d%s",&n,&m,s+1);
memset(dp,inf,sizeof(dp));
dp[0][0]=0;
for(int i=1; i<=n; i++)
{
for(int j=i; j>0; j--)
{
for(int k=j; k>0; k--)
{
dp[j][0]=min(dp[j][0],dp[j][k]);
if(s[i]=='1')
dp[j][k]=min(dp[j][k],dp[j-1][k-1]+k);
}
}
}
int ans=0;
for(int i=0; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if(dp[i][j]<=m)
ans=i;
}
}
cout<<ans<<endl;
return 0;
}