欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【动态规划】最长公共上升子序列

发布时间:2025/6/17 编程问答 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【动态规划】最长公共上升子序列 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

问题 F: 【动态规划】最长公共上升子序列

时间限制: 5 Sec  内存限制: 64 MB
提交: 34  解决: 9
[提交] [状态] [命题人:admin]

题目描述

研究发现,大猩猩的基因序列和人的基因序列只有1.3%的区别,更进一步,不仅仅离人最近的大猩猩和人的基因序列高度近似,就连以打洞为生的老鼠和人的基因序列也有高达95%的相同序列。于是有魔法师提出一个大胆设想,即改变人类的某些特定基因以期产生超级人类。

    现在,他们要做的第一步是将两种不同生物的基因序列转换成两个整数序列,并试图确定他们的最大公共上升子序列的长度,例如有A序列为4 3 2 1 7 8 9,B序列为7 8 9 4 3 2 1,其最长公共子序列是4 3 2 1,而最长公共递增子序列应该是 7 8 9。

 

输入

输入每个序列由M个整数组成(1 ≤ M ≤500),M个整数范围在(-231 ≤Bi < 231)之间。

 

输出

输出最长公共上升子序列长度L。

 

样例输入

复制样例数据

5 1 4 2 5 -12 4 -12 1 2 4

样例输出

2
#include <bits/stdc++.h> #include<map> #include<set> using namespace std; const int maxn=666; typedef long long ll; int n,m; ll p[maxn],q[maxn],ans,dp[maxn][maxn]; int main() {cin>>n;for(int i=1;i<=n;i++)scanf("%lld",&p[i]);cin>>m;for(int i=1;i<=m;i++)scanf("%lld",&q[i]);for(int i=1;i<=n;i++){ll cur=0;for(int j=1;j<=m;j++){dp[i][j]=dp[i-1][j];if(p[i]>q[j]&&dp[i-1][j]>cur)cur=dp[i-1][j];if(p[i]==q[j])dp[i][j]=cur+1;}}for(int i=1;i<=m;i++)ans=max(ans,dp[n][i]);cout<<ans<<endl;return 0; }

 

转载于:https://www.cnblogs.com/czy-power/p/10616269.html

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的【动态规划】最长公共上升子序列的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。