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
  • 相关阅读:
    vector容器(一)
    螺旋数组实现
    zigzag数组实现
    HDU 1496
    HDU 1381 Crazy Search
    什么叫软核,固核,硬核?
    “杜拉拉思维模式”之六:小组面试提升术
    硬件工程师电路设计必须紧记的十大要点
    面试的“群殴”宝典
    三段式状态机 [CPLD/FPGA]
  • 原文地址:https://www.cnblogs.com/MXang/p/10224662.html
Copyright © 2011-2022 走看看