CodeForces 706C Hard problem

Posted 啦啦啦天啦噜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 706C Hard problem相关的知识,希望对你有一定的参考价值。

题意:给你很多字符串,每个字符串可以翻转,翻转有价值,让你求满足递增的字符串,如果不行就-1

思路:要么选,要么不选,线性dp

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
const long long INF=0x3f3f3f3f3f3f3f3fLL;
string str[maxn][2];
int n,a[maxn];
long long dp[maxn][2];
string revers(string s)
{
    string res=s;
    int i,len=res.length();
    for(i=0;i<len/2;++i)
        swap(res[i],res[len-1-i]);
    return res;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        cin>>str[i][0];
        str[i][1]=revers(str[i][0]);
    }
    memset(dp,INF,sizeof(dp));
    dp[1][0]=0;dp[1][1]=a[1];
    bool ok=true;
    for(int i=2;i<=n;i++){
        if(str[i][0]>=str[i-1][0]){
            dp[i][0]=min(dp[i][0],dp[i-1][0]);
//            printf("test1\n");
        }
        if(str[i][0]>=str[i-1][1]){
            dp[i][0]=min(dp[i][0],dp[i-1][1]);
//            printf("test2\n");
        }
        if(str[i][1]>=str[i-1][0]){
            dp[i][1]=min(dp[i][1],dp[i-1][0]+a[i]);
//            printf("test3\n");
        }
        if(str[i][1]>=str[i-1][1]){
            dp[i][1]=min(dp[i][1],dp[i-1][1]+a[i]);
//            printf("test4\n");
        }
        if(dp[i][0]==INF&&dp[i][1]==INF){
            ok=false;
            break;
        }
    }
//    for(int i=1;i<=n;i++){
//        printf("%d == %lld %lld\n",i,dp[i][0],dp[i][1]);
//    }
    if(!ok)puts("-1");
    else printf("%I64d\n",min(dp[n][0],dp[n][1]));
    return 0;
}

 

以上是关于CodeForces 706C Hard problem的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 706C Hard problem(dp+字符串)

CF706C Hard problem (状态机dp)

Codeforces 1251E2-Voting (hard version)

codeforces - 1249B2 Books Exchange (hard version)

Codeforces--Books Exchange (hard version)

Codeforces Round #590 (Div. 3) B2. Social Network (hard version)