题目大意:
给定n个子字符串,对其中若干个字符串进行反转,每次反转产生代价Ci,最后使得字符串按照字典序排列,求最小代价和,不需要反转时输出-1
解题思路:
首先使字符串的两个状态,正序和反序,相当于从每两个字符串中选出一个,如果选正序代价为0,如果选反序代价为Ci,求出最终最小代价,定义方程dp[i][j]为当选完第i个状态为j的字符串时的最小代价,则有状态转移方程
dp[i][j]=min(dp[i][j],dp[i-1][k]+j*c[i])
注意初始化dp,字典序排列的比较
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
string arr[maxn][2];
ll dp[maxn][2];
int c[maxn];
int n,k;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&c[i]);
for(int i=1;i<=n;++i)
{
cin>>arr[i][0];
arr[i][1]=arr[i][0];
reverse(arr[i][1].begin(),arr[i][1].end());
for(int j=0;j<2;++j)
{
dp[i][j]=1e18;
for(int k=0;k<2;++k)
if(arr[i][j]>=arr[i-1][k])
dp[i][j]=min(dp[i-1][k]+j*c[i],dp[i][j]);
}
}
ll ans=min(dp[n][0],dp[n][1]);
if(ans>=1e18) puts("-1");
else
printf("%lld",ans);
return 0;
}