样例数据:
Sample Input
3
abc
1 1 1
abc
ccc
3
abc
1 1 1
ccc
aba
Sample Output
1
0
借鉴于求最长公共子序列的方法,
求最长公共子序列的话是
串 A 以 i 为结尾和串 B 以 j 为结尾的最长公共子序列长度 maxlen[i][j]=max(maxlen[i][j-1],maxlen[i-1][j])
当A的第i-1字符个和B的第j-1个字符一样时 maxlen[i][j] = maxlen[i-1][j-1] + 1;
而对于此题 让求最大得分,也就是最大权值。
将个数改为权值就好了
当A的第i-1字符个和B的第j-1个字符一样时 maxlen[i][j] = maxlen[i-1][j-1] + i-1的权值;
需要注意的是存入权值的时候,直接存入对应位置,方便后边使用。
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 20010
char ch[30],str1[maxn],str2[maxn];
int w[30],n,dp[maxn][maxn];
int main(){
while(~scanf("%d",&n)){
scanf("%s",ch);
for(int i=0;i<n;i++)scanf("%d",&w[ch[i]-'a']);
scanf("%s%s",str1,str2);
int l1=strlen(str1);
int l2=strlen(str2);
for(int i=0;i<=l1;i++)dp[i][0]=0;
for(int i=0;i<=l2;i++)dp[0][i]=0;
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(str1[i-1]==str2[j-1])
dp[i][j]=dp[i-1][j-1]+w[str1[i-1]-'a'];
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[l1][l2]<<endl;
}
return 0;
}