zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 57 (Rated for Div. 2)D(动态规划)

    #include<bits/stdc++.h>
    using namespace std;
    char s[100007];
    long long a[100007];
    long long dp[100007][4];
    int main(){
        int n;
        scanf("%d",&n);
        scanf("%s",s);
        for(int i=0;i<n;i++)
            scanf("%lld",&a[i]);
        for(int i=0;i<n;i++){
            dp[i][0]=dp[i-1][0];//dp[i][j],i表示第i位字符,j表示hard已经拥有了几个
            dp[i][1]=dp[i-1][1];
            dp[i][2]=dp[i-1][2];
            dp[i][3]=dp[i-1][3];
            if(s[i]=='h')
                dp[i][0]+=a[i],dp[i][1]=min(dp[i-1][0],dp[i-1][1]);//如果仍要保持hard长度为0,则不能拥有'h',所以dp[i][0]+=a[i],如果不删这个'h',则dp[i][1]更新为dp[i-1][0]和dp[i-1][1]中更小的一个,这里的意义为如果不删这个'h'原本的dp[i-1][1]更小,那么就不删,如果删了dp[i-1][0]+a[i]更小,就删,实际上是考虑了每一步删与不删的情况
            else if(s[i]=='a')
                dp[i][1]+=a[i],dp[i][2]=min(dp[i-1][1],dp[i-1][2]);//类似上面
            else if(s[i]=='r')
                dp[i][2]+=a[i],dp[i][3]=min(dp[i-1][2],dp[i-1][3]);//类似上面
            else if(s[i]=='d')
                dp[i][3]+=a[i];
        }
        long long ans=1e18;
        for(int i=0;i<4;i++)
            ans=min(ans,dp[n-1][i]);//找出最优方案
        printf("%lld",ans);
        return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    nyoj----522 Interval (简单树状数组)
    HDUOJ-----2838Cow Sorting(组合树状数组)
    HDUOJ---2642Stars(二维树状数组)
    HDUOJ -----Color the ball
    ACM遇到的问题与解决方案
    ELK架构下利用Kafka Group实现Logstash的高可用
    Linux给力的Shell命令
    i18n 语言码和对应的语言库
    jar启动脚本shell
    持续集成和部署工具GOCD
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10284077.html
Copyright © 2011-2022 走看看