hdu 1423 dp 求最长公共上升子序列
来源:互联网 发布:知乎 俄罗斯 计算机 编辑:程序博客网 时间:2024/05/21 19:33
This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence.
151 4 2 5 -124-12 1 2 4
2
题意:是求最长公共上升子序列
最长公共上上升子序列的详解:http://www.cnblogs.com/wd-one/p/4470844.html
思路:用动态规划:
dp[i][j]存的是当a数组长度为i时,b数组长度为j时且b[j]为结尾的最长公共上升子序列;
代码里有思路和解释:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int dp[550][550];//dp[i][j] 存的是当a数组长度为i时,b数组长度为j时且b[j]为结尾的 int n,m;//最长公共上升子序列; int a[550],b[550]; // 当a[i]!=b[j] 时,dp[i][j]=dp[i-1][j]; //因为 d[i][j] 是以 b[j] 为结尾的LCIS, //如果 d[i][j] > 0 那么就说明 a[1] .... a[i] 中必然有一个元素 a[k] 等于 b[j] // 当a[i]==b[j] 时,d[i][j]=max(dp[i-1][k])+1;其中b[j]>b[k]; ////只有当a[i] > b[j]时,才更新Max, 保证了所求序列是上升的。 int main(){int i,j,k,t;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);scanf("%d",&m);for(i=1;i<=m;i++)scanf("%d",&b[i]);int Max,M=0;memset(dp,0,sizeof(dp));for(i=1;i<=n;i++){Max=0;for(j=1;j<=m;j++){if(a[i]!=b[j]){dp[i][j]=dp[i-1][j];if(a[i]>b[j]&&dp[i-1][j]>Max) { Max=dp[i-1][j];}}//要理解为啥a[i]>b[j]时;// a[i] 是外层循环,当和内层循环b[j]相等时,这一步是为了在找出前面// 小于b[j] 的最大值 ,就是为啥是dp[i-1][j]>Max而不是dp[i][j],因为要找以b[j]结尾的最长公共上升子序列,当
//b[j]==a[i] ,也就是找a[i]的,若写dp[i][j]的话,就把a[i]也算进去了,a[i] 只能结尾于最长公共子序列的末尾;
else {dp[i][j]=Max+1;}M=max(M,dp[i][j]);}}printf("%d\n",M);if(t) printf("\n");} return 0;}
阅读全文
0 0
- hdu 1423 dp 求最长公共上升子序列
- HDU 1423 最长上升公共子序列
- hdu 1423 最长公共上升子序列
- hdu 1423(最长公共上升子序列)
- 最长公共上升子序列 (dp)
- [DP]最长公共上升子序列LCIS
- 【hdu1423】【DP】最长公共上升子序列
- 最长公共上升子序列(dp)
- hdu 1423 Greatest Common Increasing Subsequence(DP 最长公共上升子序列)
- hdu 1423 Greatest Common Increasing Subsequence(最长公共上升子序列dp)
- hdu 4512 最长公共上升子序列
- Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp
- hdu 1423 最长上升公共子序列 LCIS 模板题
- LCIS最长上升公共子序列(HDU 1423)
- HDU 1423 动态规划—最长公共上升子序列
- [HDU 1423] Greatest 最长上升公共子序列
- HDU 1423 (最长上升公共子序列)
- HDU 1423 求求求求求求最长上升公共子序列
- 他们为什么选择前端工程化,而我又是基于什么考虑的
- LinuxStudyNote(18)-Linux常用命令(2)-文件处理命令(13)-文件显示(4)-less分页显示文件内容往前翻页以及内容查找
- 扰心的总结
- 杨辉三角问题 Java和Python实现
- 【笔记】java8中List分组方法的使用
- hdu 1423 dp 求最长公共上升子序列
- byte[]与short、int、long、float、double的互换
- 使用Linux服务器后台运行程序
- 作用域
- [hdu2196]Computer(树形dp)
- caffe-ristretto:可以定点的层目录
- 简单的轮播图
- 离散PID基础知识
- 开源大数据生态圈