牛客练习赛36B

唔在cf上做过,A题也做过,神仙说D题也是原题

这个题就是dp了。然后数组滚动一下,很显然能住遇到  i 只与 i-1 有关,所以还是挺好滚的。

dp[i][j][k]表示到第I 天一共工作了J天连续工作了K天还剩的  体力值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int n,k;
 5 string s;
 6 int dp[2][401][401];
 7 int main(){
 8     ios::sync_with_stdio(false);
 9     cin>>n>>k>>s;
10     s="*"+s;
11     memset(dp,-1, sizeof(dp));
12     dp[0&1][0][0]=k;
13     for(int i=1;i<=n;i++){
14         dp[i&1][0][0]= k;
15         if(s[i]=='0'){
16             for(int j=0;j<=i;j++){
17                 for(int k=0;k<=j;k++) {
18                     dp[i&1][j][0] = max(dp[i&1][j][0], dp[(i-1)&1][j][k]);
19                 }
20             }
21         } else{
22             //不工作
23             for(int j=0;j<=i;j++){
24                 for(int k=0;k<=j;k++) {
25                     dp[i&1][j][0] = max(dp[i&1][j][0], dp[(i-1)&1][j][k]);
26                 }
27             }
28             //工作
29             for(int j=1;j<=i;j++){
30                 for(int k=0;k<=j;k++) {
31                     dp[i&1][j][k+1] = max(dp[i&1][j][k+1], dp[(i-1)&1][j-1][k]-1-k);
32                 }
33             }
34         }
35     }
36     int ans = 0;
37     for(int j=0;j<=n;j++){
38         for(int k=0;k<=j;k++){
39             if(dp[n&1][j][k]>=0){
40                 ans = max(ans,j);
41             }
42         }
43     }
44     cout<<ans<<endl;
45 }
View Code
原文地址:https://www.cnblogs.com/MXang/p/10224662.html