题意:给你很多字符串,每个字符串可以翻转,翻转有价值,让你求满足递增的字符串,如果不行就-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 "); } if(str[i][0]>=str[i-1][1]){ dp[i][0]=min(dp[i][0],dp[i-1][1]); // printf("test2 "); } if(str[i][1]>=str[i-1][0]){ dp[i][1]=min(dp[i][1],dp[i-1][0]+a[i]); // printf("test3 "); } if(str[i][1]>=str[i-1][1]){ dp[i][1]=min(dp[i][1],dp[i-1][1]+a[i]); // printf("test4 "); } if(dp[i][0]==INF&&dp[i][1]==INF){ ok=false; break; } } // for(int i=1;i<=n;i++){ // printf("%d == %lld %lld ",i,dp[i][0],dp[i][1]); // } if(!ok)puts("-1"); else printf("%I64d ",min(dp[n][0],dp[n][1])); return 0; }