Codeforces 706C Hard problem (DP)

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值