题意 : 给你两个字符串,两个字符串都有共同的字母,给你每个字母的值,规则是,找出两个字符串中的共同的一个字母,然后这个字母的值就可以加到自己的分数上,但是这步操作之后,这两个字母及其之前的字母都要删除掉,问你能够得到的最大的值是什么。
思路:最长公共子序列,加了一个权值。
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h> using namespace std; int a[] ;
int dp[][] ;
int s ;
char ch ;
string sh1,sh2 ; int main()
{
int n ;
while(cin >> n)
{
for(int i = ; i < n ; i++)
{
cin >> ch >> s;
a[int(ch)] = s ;
}
cin >> sh1 >> sh2 ;
memset(dp,,sizeof(dp)) ;
for(int i = ; i <= sh1.size() ; i++)
for(int j = ; j <= sh2.size() ; j++)
{
dp[i][j] = max(dp[i-][j],dp[i][j-]) ;
if(sh1[i-] == sh2[j-])
dp[i][j] = max(dp[i][j],dp[i-][j-]+a[int(sh1[i-])]) ;
}
printf("%d\n",dp[sh1.size()][sh2.size()]) ;
}
return ;
}