zoukankan      html  css  js  c++  java
  • 牛客练习赛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
  • 相关阅读:
    勿忘初心
    欧拉函数与数论的结合UVA11426
    法雷级数
    欧拉函数及其应用
    poyla计数问题
    组合计数问题中容斥原理的应用
    数学问题当中的一些基本计数问题
    HDU4642博弈好题
    KMP算法在字符串中的应用
    UVA11722概率问题之线性规划
  • 原文地址:https://www.cnblogs.com/MXang/p/10224662.html
Copyright © 2011-2022 走看看