Codeforces Hard problem(dp、字符串)

在这里插入图片描述
题目大意:
给定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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章