求有权值的最长公共子序列,在动态规划过程中添加一个判断条件即可,详细见注释。
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 2100;
int dp[MAXN][MAXN]; //dp[i][j]表示前i发子弹打前j个恐怖分子,能获得的最高分数
int main()
{
string allType; //所有类型
string terrorist; //恐怖分子类型
string bullet; //子弹类型
int score[150]; //各类型的恐怖分子对应的分数
int N; //类型数量
while (cin >> N)
{
memset(dp, 0, sizeof(dp));
memset(score, 0, sizeof(score));
cin >> allType;
for (int i = 0; i < N; i++) //输入各类型恐怖分子的分数
{
cin >> score[allType[i]];
}
cin >> bullet;
cin >> terrorist;
int lenB = bullet.size();
int lenT = terrorist.size();
for (int i = 1; i <= lenB; i++) //动态规划
{
for (int j = 1; j <= lenT; j++)
{
if (bullet[i - 1] == terrorist[j - 1]) //当前子弹和恐怖分子类型相同,选择是否射击
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + score[terrorist[j - 1]]);
else //类型不同,选择舍弃子弹或者舍弃恐怖分子
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
}
cout << dp[lenB][lenT] << endl;
}
return 0;
}
继续加油。
本文介绍了一种求解有权值最长公共子序列问题的动态规划算法,通过一个具体示例,展示了如何在子弹与恐怖分子类型匹配时,计算出最高得分。算法考虑了子弹类型与恐怖分子类型的匹配度,并在动态规划过程中加入了额外的判断条件。
229

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



