唔在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 }