题意:给你很多字符串,每个字符串可以翻转,翻转有价值,让你求满足递增的字符串,如果不行就-1
思路:要么选,要么不选,线性dp
代码:
#includeusing 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 >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;}