标签:
题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分。
这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问题。但是我 WA 了四发```第一发,t 定义了两次,并执意要从下标 1 开始读(这个貌似没问题的)。第二次是改了之后 dp 数组的转移方程没有写对。第三 WA 是改了转移方程还是没有改对Orz ,第四 WA 是```我的内心几乎是崩溃的,恩,还是没有改对……
1 #include<stdio.h> 2 #include<string.h> 3 #define max(a,b) a>b?a:b 4 5 int dp[2105][2105],v[30]; 6 7 int main(){ 8 char s1[50],s2[2105],s3[2105]; 9 int n; 10 while(scanf("%d",&n)!=EOF){ 11 scanf("%s",s1); 12 int i,t,j,ans=0; 13 for(i=0;i<n;i++){ 14 scanf("%d",&t); 15 v[s1[i]-‘a‘]=t; 16 } 17 memset(dp,0,sizeof(dp)); 18 scanf("%s%s",s2,s3); 19 int l2=strlen(s2),l3=strlen(s3); 20 for(i=1;i<=l2;i++){ 21 for(j=1;j<=l3;j++){ 22 if(s2[i-1]==s3[j-1]){ 23 dp[i][j]=dp[i-1][j-1]+v[s2[i-1]-‘a‘]; 24 } 25 else { 26 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 27 } 28 ans=max(ans,dp[i][j]); 29 } 30 } 31 printf("%d\n",ans); 32 } 33 return 0; 34 }
标签:
原文地址:http://www.cnblogs.com/cenariusxz/p/4322446.html