解题思路:不断将a数组的前i个字符与b数组的前j个字符对比。
dp数组规律:1)如果a数组的第i个字符等于b数组的第j个字符相同,则公共子序列长度+1,接着再对比a数组的前i-1个字符和b数组的j-1个字符。
dp[i][j]=dp[i-1][j-1]+1;
2)如果a数组的第i个字符与b数组的第j个字符不相同,则可以选择将a[i]去掉或b[j]去掉,取两种情况的最大值。
dp[i][j]=max(dp[i-1][j],dp[i][j-1]).
#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001];
int main()
{
int n,m;
cin>>n>>m;
int arr[1001],brr[1001];
for(int i=1;i<=n;i++){
cin>>arr[i];
}
for(int i=1;i<=m;i++){
cin>>brr[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(arr[i]==brr[j]){
dp[i][j]=1+dp[i-1][j-1];
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[n][m];
return 0;
}