分析:dp(j)表示b序列到达i时与a序列构成的LCIS的最优解。
当a[i]==b[j]时,dp(j)为0到j-1中最大的dp值更新当前dp(j)。若a[i]>b[j],保存当前的最大的dp值,因为要上升,所以只需要找a[i] > b[j]的。若a[i]<b[j]则已经打破上升性(在b序列中),所以就不用记录当前最大的dp值
#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
int a[maxn],b[maxn];
int dp[maxn]; //dp(i)表示b序列到达i时与a序列构成的LCIS的最优解
int n,m;
void solve(){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
int k = 0;
for(int j = 0;j < m;j++){
if(a[i] == b[j])
dp[j] = max(dp[j],dp[k]+1);
if(a[i] > b[j]){
if(dp[j] > dp[k])
k = j;
}
}
}
int MAX = 0;
for(int i = 0;i < m;i++){
MAX = max(dp[i],MAX);
}
printf("%d\n",MAX);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(int i= 0;i < m;i++){
scanf("%d",&b[i]);
}
solve();
if(t)
printf("\n");
}
return 0;
}
本文介绍了一种基于动态规划的方法来解决最长公共递增子序列(LCIS)问题。通过两个序列a和b,利用dp数组记录最优解,实现对最长公共递增子序列的有效求解。
19万+

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



