题解:AT_past202112_h 最長非共通部分列
wen_hao_shi_wo · · 题解
这是本蒟蒻的第一篇题解。
前置
题目传送门
AC记录
题目思路
这就是一道最长不公共子序列,我们可以用邪恶美丽的动态规划(DP)解决,首先我们定义 dp 数组为 A 和 B 的最长不公共子序列,接着我们要学会找动态转移方程,这也是学习 DP 最难的知识点之一,可以自己在草稿纸上找一找,画一画;
我们可以发现当
思路到此为止,建议大家先自己尝试,有不懂的再看一下代码。
代码:
#include<bits/stdc++.h>//万能头
using namespace std;
string a,b;//创建俩个字符串a,b
int dp[5003][5003];//创建二维数组dp
int main(){
ios::sync_with_stdio(false);
cin.tie(0);//提高运行速度
cin>>a>>b;//读入
int lena=a.size();//保存字符串a的长度
int lenb=b.size();//保存字符串b的长度
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
if(a[i-1]!=b[j-1])dp[i][j]=dp[i-1][j-1]+1;//不等的情况
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//相等的情况
}
}
cout<<dp[lena][lenb];//答案保存在dp[lena][lenb]
return 0;//完结散花!!!
}