[HDU 1423] Greatest 最长上升公共子序列
2015-08-04 17:14
393 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1423
题意:求最长上升公共子序列。。。。
思路:动态规划咯,dp[i][k] 表示序列a中[1, i]和b序列中[1, k]选出的最长的以b[k]结尾的上升公共子序列,所以转移方程就是:
计算完后只要遍历一下dp
[0]…dp
[m],找出最大值就行了
代码如下:
上面代码的复杂度是o(n^3), 解决这个题目是没有问题了,其实我们还可以优化,上面的for(int l = 0; l < k; l++)循环每次都只计算到 k-1 总是小于我们的上一个循环,所以我们可以这样改程序
题意:求最长上升公共子序列。。。。
思路:动态规划咯,dp[i][k] 表示序列a中[1, i]和b序列中[1, k]选出的最长的以b[k]结尾的上升公共子序列,所以转移方程就是:
计算完后只要遍历一下dp
[0]…dp
[m],找出最大值就行了
代码如下:
[code]#include <cstdio> #include <cstring> #include <iostream> using namespace std; int n, m; int arga[505]; int argb[505]; int dp[505][505]; int main() { int Test; cin>>Test; while(Test--){ cin>>n; for(int i = 1; i <= n; i++){ cin>>arga[i]; } cin>>m; for(int i = 1; i <= m; i++){ cin>>argb[i]; } memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++)//遍历序列a { for(int k = 1; k <= m; k++) //遍历序列b { dp[i][k] = dp[i-1][k]; if(arga[i] == argb[k]){ int ans = 0; for(int l = 0; l < k; l++){ if(arga[i] > argb[l] && dp[i-1][l] > ans) //找结尾比a[i]的最长上升公共子序列 ans = dp[i-1][l]; } dp[i][k] = ans + 1; //等于最长的加一 } } } int maxn = 0; //找出最优的解 for(int i = 1; i <= m; i++){ if(dp [i] > maxn){ maxn = dp [i]; } } cout<<maxn<<endl; if(Test) cout<<endl; } return 0; }
上面代码的复杂度是o(n^3), 解决这个题目是没有问题了,其实我们还可以优化,上面的for(int l = 0; l < k; l++)循环每次都只计算到 k-1 总是小于我们的上一个循环,所以我们可以这样改程序
[code]#include <cstdio> #include <cstring> #include <iostream> using namespace std; int n, m; int arga[505]; int argb[505]; int dp[505][505]; int main() { int Test; cin>>Test; while(Test--){ cin>>n; for(int i = 1; i <= n; i++){ cin>>arga[i]; } cin>>m; for(int i = 1; i <= m; i++){ cin>>argb[i]; } memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++){ int ans = 0; for(int k = 1; k <= m; k++){ dp[i][k] = dp[i-1][k]; if(arga[i] > argb[k]) //因为当前所求的最长序列是以a[i]结尾的,所以我们可以这样。 ans = max(ans, dp[i-1][k]); if(arga[i] == argb[k]){ dp[i][k] = ans + 1; } } } int maxn = 0; for(int i = 1; i <= m; i++){ if(dp [i] > maxn){ maxn = dp [i]; } } cout<<maxn<<endl; } return 0; }
相关文章推荐
- AndroidApp打包后怎么查看ksystore签名
- CSS 单行溢出文本显示省略号...的方法(兼容IE FF)
- vim中添加molokai.vim 配色安装
- 机器学习(一)——K-近邻(KNN)算法
- 1、jvm的体系结构
- NSFileManager
- @Transactional 注解说明
- Activiti之 Exclusive Gateway
- iOS 实现圆角图片显示
- php_xdebug安装+NetBeans的配置和使用
- ceph存储 gdb断点—断点设置
- chm文件打不开:提示"已取消到该网页的导航"的解决办法
- Objective-C 动态类型检测 类和实力对象能否响应方法
- ZOJ - 3621——Factorial Problem in Base K
- Hive array字段 查询过滤
- 【暑假】[基本数据结构]根据in_order与post_order构树
- 交叉编译中的 --sysroot 等等在编译时的作用
- 更新日期 2017年9月15日 - Citrix桌面虚拟化平台-交付推荐版本及相关hotfix
- 杭电2521 反素数
- ADMT3.2域迁移之Server2003至Server2012系列(一)环境准备