http://acm.hdu.edu.cn/showproblem.php?pid=1243
全是变着法子lcs
用map储存一个字母对应的分值即可
因为不知道数据范围,二维数组开大会炸,于是用模2数组,感觉自己屌屌哒
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<stack>
using namespace std;
map<char,int> ST;
char A[11111];
char B[11111];
int dp[2][11111];
int main()
{
cin.sync_with_stdio(false);
int n;
while (cin>>n)
{
ST.clear();
string stmp;
getline(cin,stmp);//这儿还留这个换行符要去掉
getline(cin,stmp);
for (int i=0;i<n;i++)
{
int tmp;
cin>>tmp;
ST[stmp[i]]=tmp;
}
memset(dp,0,sizeof(dp));
cin>>A+1>>B+1;
int al(strlen(A+1)),bl(strlen(B+1));
for (int i=1;i<=al;i++)
{
for (int j=1;j<=bl;j++)
{
if (A[i]==B[j])
dp[i%2][j]=dp[(i-1)%2][j-1]+ST[A[i]];
else
dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
}
}
cout<<dp[al%2][bl]<<endl;
}
return 0;
}