#### 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吧。