//LCS
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 100
int a[MAX_N],b[MAX_N];
int dp[MAX_N][MAX_N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>b[i];
/**
*确定子问题:
得到当前长度为i的a数组和
长度为j的数组b的LCS
*调整初始状态:
x为任意
a[0][x] = a[x][0] = 0;
含义:无论是a为0还是b为零,LCS长度都为零
*状态转移方程:
1.初始状态
2.如果a[i] == b[j] =>> dp[i][j] = d[i][j]+1;
3.如果a[i] != b[j] =>> dp[i][j] = max(a[i]与b[j-1]比,a[i-1]与b[j]比)
*/
/**
for(int i=0;i<n;i++){
dp[i][0]=0;
dp[0][i]=0;
}
*/
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
if(a[i] == b[j]){
dp[i+1][j+1] = dp[i][j]+1;
}
else{
dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]);
}
}
}
//print
for(int i = 0;i<=n;i++){
for(int j = 0;j<=m;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<dp[n][m]<<endl;
return 0;
}
/**
data:
8 9
1 3 4 5 6 7 7 8
3 5 7 4 8 6 7 8 2
print:
5
*/
【菜鸟er】动态规划_最长公共子序列
最新推荐文章于 2024-05-05 13:15:43 发布