Codeforces 706C

#### Codefores 706C ## ##

  • 題目大意:給你n個字符串,要求滿足字典序排序 等價於 s[i]>=s[i-1]。每個操作需要花費能量,操作只能反轉。如果不能滿足題意輸出-1。
  • 題目分析:動態規劃。dp數組有兩種狀態,反轉與不反轉,可用0/1表示。有四種情況, dp[now][0]與dp[now-1][0/1],dp[now][0/1]與dp[now-1][0]
#include<bits/stdc++.h>
#define me(a,b) memset(a,b,sizeof(a))
#define MAX 100005
#define INF 1e16
#define LL long long
using namespace std;

LL dp[MAX][2];
string s[MAX],ds[MAX];
LL cost[MAX];
int main() {
    int n;
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
            cin>>cost[i];
        for(int i=1;i<=n;i++)
        {
            cin>>s[i];
            ds[i]=s[i];
            reverse(ds[i].begin(),ds[i].end());
        }
        for(int i=1;i<=n;i++)
            dp[i][0]=dp[i][1]=INF;
        dp[1][0]=0;dp[1][1]=cost[1];
        for(int i=2;i<=n;i++)
        {
            if(s[i]>=s[i-1])
                dp[i][0]=dp[i-1][0];
            if(ds[i]>=s[i-1])
                dp[i][1]=dp[i-1][0]+cost[i];
            if(s[i]>=ds[i-1])
                dp[i][0]=min(dp[i-1][1],dp[i][0]);
            if(ds[i]>=ds[i-1])
                dp[i][1]=min(dp[i-1][1]+cost[i],dp[i][1]);
        }
        printf("%I64d\n",min(dp[n][1],dp[n][0])==INF?-1:min(dp[n][1],dp[n][0]));
    }
    return 0;
}

注意數據範圍,用了一次0x3f 果斷太小 ,大家還是別偷懶 寫個for吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章