刚开始学动态规划,想通过几个例题来巩固一下。
题目一:
ADV-202.
最⻓公共⼦序列(动态规划)
问题描述
给定两个字符串,寻找这两个字串之间的最⻓公共⼦序列。
输⼊格式
输⼊两⾏,分别包含⼀个字符串,仅含有⼩写字⺟。
输出格式
最⻓公共⼦序列的⻓度。
样例输⼊
abcdgh
aedfhb
样例输出
3
样例说明
最⻓公共⼦序列为
a
,
d
,
h
。
数据规模和约定
字串⻓度
1~1000
。
很典型的
longest common subsequence问题
推得的公式:
列出如下表格:
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
#include<set>
using namespace std;
int dp[1001][1001];
int main()
{
string s1,s2;
cin>>s1>>s2;
for(int i=1;i<=s1.length();i++)
for(int j=1;j<=s2.length();j++)
{
if(s1[i-1]==s2[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[s1.length()][s2.length()];
}