关闭

Codeforces 706C Hard problem (DP)

114人阅读 评论(0) 收藏 举报
分类:
#include<math.h>
#include<string>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long  a[100005];
string str1[100005],str2[100005];
long long dp[100005][2];
int main()
{
    int t;  scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        scanf("%I64d",&a[i]);
    }
    for(int i=1;i<=t;i++)
    {
        cin>>str1[i];
        str2[i]=string(str1[i].rbegin(),str1[i].rend());
    }
    for(int i=1;i<=t;++i)
            dp[i][0]=dp[i][1]=1e15;
    dp[1][0]=0; dp[1][1]=a[1];
    int i;
    for(i=2;i<=t;i++)
    {
        if(str1[i-1]<=str1[i])
            dp[i][0]=dp[i-1][0];

        if(str1[i-1]<=str2[i])
            dp[i][1]=dp[i-1][0]+a[i];

        if(str2[i-1]<=str1[i])
            dp[i][0]=min(dp[i-1][1],dp[i][0]);

        if(str2[i-1]<=str2[i])
            dp[i][1]=min(dp[i-1][1]+a[i],dp[i][1]);

        if(dp[i][0]==1e15&&dp[i][1]==1e15)
            break;
         //printf("%d %d\n",dp[i][0],dp[i][1]);
    }
    if(i==t+1)
        printf("%I64d\n",min(dp[t][1],dp[t][0]));
    else
        printf("-1\n");
}




题意:

给定一个序列C 表示 翻转 字符串 的花费。

求使 从上到下 可以翻转 字符串  字典序不降。

最终结果可以为:

ab       (ab)<(ac)

ac


aa (aa)<(ab)<(ac)

ab

ac


bbb 不管怎么翻转 都不会使 字典序 不降。

aaa


对于字符串一定存在两种状态。翻转或者不翻转。dp【i】【0】表示不翻转 dp【i】【1】表示翻转。

i-1不翻      i翻      str1【i-1】<str2【i】 (考虑需不需要加上条件 str1【i-1】>str1【i】)不需要。。。。。 加上条件是 具体的情况下进行转换。

这个条件存在是因为当 str1【i-1】<str2【i】成立,是因为str1【i-1】>str1【i 】成立 不加条件是 状态进行转换。


i-1翻 i不翻 str【i-1】<str1【i】

i-1翻 i不翻 str2【i-1】<str2【i】

i-1不翻 i不翻 str1【i-1】<str1【i】



断网啦。。。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:44302次
    • 积分:3094
    • 等级:
    • 排名:第11949名
    • 原创:274篇
    • 转载:7篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论