码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 706C Hard problem

时间:2018-02-20 22:50:59      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:ble   false   st3   break   ace   length   bit   字符   inf   

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

标签:ble   false   st3   break   ace   length   bit   字符   inf   

原文地址:https://www.cnblogs.com/lalalatianlalu/p/8455943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!