这道题怎么会没做过呢。。。我觉得我绝逼是见过这道题的了,,最长公共子序列的简单变形。
#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;
}

本文分享了一道最长公共子序列的变形题目的解题思路及C++代码实现。通过动态规划方法,针对输入字符串计算特定条件下的最大值。
385

被折叠的 条评论
为什么被折叠?



