hdu1243----最长公共子序列

原题链接

样例数据:
 

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;
}

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/81268987