这道题怎么会没做过呢。。。我觉得我绝逼是见过这道题的了,,最长公共子序列的简单变形。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 100010
int a[550];
int dp[2][maxn];
int main()
{
int n;
while(cin>>n)
{
memset(dp,0,sizeof(dp));
string s,x,y;
cin>>s;
for(int i=0;i<n;i++)
{
cin>>a[s[i]];
}
cin>>x>>y;
int flag=0;
for(int i=0;i<x.length();i++)
{
flag=i&1;
for(int j=0;j<y.length();j++)
{
if(y[j]!=x[i])
dp[flag][j+1]=max(dp[flag][j],dp[!flag][j+1]);
else
dp[flag][j+1]=max(max(dp[flag][j],dp[!flag][j+1]),dp[!flag][j]+a[y[j]]);
}
}
cout<<dp[flag][y.length()]<<endl;
}
return 0;
}