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;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    lombk在IDEA中报ClassNotFoundException错误
    Groovy在不同JDK版本下的性能差异
    Groovy中那些神奇注解之InheritConstructors
    Groovy中那些神奇注解之ToString
    Groovy中那些神奇注解之Memoized
    写个自己的远程桌面
    JAVA的BIT数组
    基于JDK 8的Dubbo Admin
    走进Groovy (二)
    走进Groovy (一)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10284077.html
Copyright © 2011-2022 走看看