Codeforces Round #367 (Div. 2) C. Hard problem

题目链接:Codeforces Round #367 (Div. 2) C. Hard problem

题意:

给你一些字符串,字符串可以倒置,如果要倒置,就会消耗vi的能量,问你花最少的能量将这些字符串排成字典序

题解:

当时1点过头太晕了,看错题了,然后感觉全世界都会,就我不会,- -!结果就是一个简单的DP,

设dp[i][0]表示第i个字符串不反转的情况,dp[i][1]表示第i个字符串反转的情况

状态转移方程看代码

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int N=1e5+7;
 7 ll dp[N][2],inf=(1ll<<62)-1;
 8 int n,v[N],lena,lenb;
 9 char a[N],b[N],c[N],d[N];
10 
11 inline void up(ll &a,ll b){if(a>b)a=b;}
12 
13 int main()
14 {
15     scanf("%d",&n);
16     F(i,1,n)scanf("%d",v+i);
17     scanf("%s",a),lena=strlen(a);
18     for(int i=0,j=lena-1;i<lena;i++,j--)c[j]=a[i];
19     dp[1][0]=0,dp[1][1]=v[1],c[lena]='\0';
20     F(i,2,n)
21     {
22         scanf("%s",b),lenb=strlen(b),d[lenb]='\0';
23         for(int ii=0,j=lenb-1;ii<lenb;ii++,j--)d[j]=b[ii];
24         dp[i][0]=dp[i][1]=inf;
25         if(strcmp(a,b)<=0)up(dp[i][0],dp[i-1][0]);
26         if(strcmp(c,b)<=0)up(dp[i][0],dp[i-1][1]);
27         if(strcmp(a,d)<=0)up(dp[i][1],dp[i-1][0]+v[i]);
28         if(strcmp(c,d)<=0)up(dp[i][1],dp[i-1][1]+v[i]);
29         strcpy(a,b),strcpy(c,d),lena=lenb;
30     }
31     ll ans=min(dp[n][0],dp[n][1]);
32     printf("%I64d\n",ans==inf?-1:ans);
33     return 0;
34 }
View Code

 

posted @ 2016-08-12 15:17  bin_gege  阅读(144)  评论(0编辑  收藏  举报