#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】
断网啦。。。