当前出现的局面有解的只有四种:当前字符串大于前一个,或大于前一个的反串;当前的串的反串大于前一个,或大于前一个的反串。四个if语句来转移即可。
代码:(代码参考过别人的,但分析都是自己写的)
#include<bits/stdc++.h> #define inf 1e18 using namespace std; long long num[100010]; long long dp[100010][2]; string s1[100010],s2[100010]; int main() { int n;cin>>n; for(int i=1;i<=n;++i)cin>>num[i]; for(int i=1;i<=n;++i){ cin>>s1[i];s2[i]=s1[i]; reverse(s2[i].begin(),s2[i].end()); } dp[1][1]=num[1]; for(int i=2;i<=n;++i){ dp[i][1]=dp[i][0]=inf; if(s1[i]>=s1[i-1]){ dp[i][0]=min(dp[i][0],dp[i-1][0]); } if(s1[i]>=s2[i-1]){ dp[i][0]=min(dp[i][0],dp[i-1][1]); } if(s2[i]>=s1[i-1]){ dp[i][1]=min(dp[i][1],dp[i-1][0]+num[i]); } if(s2[i]>=s2[i-1]){ dp[i][1]=min(dp[i][1],dp[i-1][1]+num[i]); } } long long ans; ans=min(dp[n][0],dp[n][1]); if(ans==inf){ cout<<-1<<endl; } else { cout<<ans<<endl; } return 0; }