【题目含义】 题目给你每一个字母的价值,然后给你两个字符串a,b,如果a串第i个字符和b串第j个字符相同,则加上该字符的价值,如果不相等则什么也不做。
【题目分析】该题就是求字符串a和字符串b的最长公共子序列,只不过,在字符相同时不再是加1,而是加上该字符的价值。
【代码】
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 10+2000
using namespace std;
char a[MAXN],b[MAXN];
struct node{
char ch;
int v;
}t[MAXN];
int res[MAXN][MAXN];
void init()
{
for(int i = 0; i < MAXN; i++)
res[0][i] = res[i][0] = 0;
}
int find(char ch)
{
int i = 1;
while(t[i].ch != ch)
i++;
return t[i].v;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
init();
while(cin>>n){
getchar();
for(int i = 1; i <= n; i++){
t[i].ch=getchar();
getchar();
scanf("%d",&t[i].v);
getchar();
}
scanf("%s%s",a+1,b+1);
int len_a = strlen(a+1);
int len_b = strlen(b+1);
for(int i = 1; i <= len_a; i++){
for(int j = 1; j <= len_b; j++){
if(a[i] == b[j]){
res[i][j] = res[i-1][j-1] + find(a[i]);
}
else{
res[i][j] = max(res[i][j-1],res[i-1][j]);
}
}
}
cout<<res[len_a][len_b]<<endl;
}
return 0;
}