zoukankan      html  css  js  c++  java
  • CF706C Hard problem (状态机dp)

    看数据,很容易想到设计状态f[i][0/1]表示该位是否反转的最大值,第一次看题的时候看成每个字符都要单调递增,其实是每次字符串的字典序要单调递增。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<map>
    #include<algorithm>
    #define ull unsigned long long
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    string s[N],s1[N];
    ll p[N];
    ll f[N][2];
    int main(){
        int i;
        int n;
        cin>>n;
        for(i=1;i<=n;i++){
            scanf("%lld",&p[i]);
        }
        for(i=1;i<=n;i++){
            cin>>s[i];
            s1[i]=s[i];
            reverse(s1[i].begin(),s1[i].end());
        }
        for(i=1;i<=n;i++){
            for(int j=0;j<=1;j++)
                f[i][j]=1e18;
        }
        f[1][0]=0;
        f[1][1]=p[1];
        for(i=2;i<=n;i++){
            if(s[i]>=s[i-1])
                f[i][0]=min(f[i][0],f[i-1][0]);
            if(s[i]>=s1[i-1])
                f[i][0]=min(f[i][0],f[i-1][1]);
            if(s1[i]>=s[i-1])
                f[i][1]=min(f[i][1],f[i-1][0]+p[i]);
            if(s1[i]>=s1[i-1])
                f[i][1]=min(f[i][1],f[i-1][1]+p[i]);
        }
        ll ans=min(f[n][1],f[n][0]);
        if(ans==1e18)
        cout<<-1<<endl;
        else
            cout<<ans<<endl;
    
    }
    View Code
  • 相关阅读:
    51NOD 1371填数字
    51NOD1052 最大M字段和
    ZROI2018提高day4t3
    ZROI2018提高day4t2
    ZROI2018提高day4t1
    ZROI2018普转提day2t4
    ZROI2018普转提day2t2
    ZROI2018普转提day2t1
    ZROI2018普转提day2t3
    ZROI2018提高day3t3
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12601838.html
Copyright © 2011-2022 走看看