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 }