POJ 2127 最长公共上升子序列
2024-09-21 21:37:03
动态规划法:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define sc(a,b) scanf("%d%d",&a,&b)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 1004
#define MN 1008
#define INF 100000007
#define eps 1e-7
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
int n1,n2,a[MM],b[MM];//a,b序列及其长度
int dp[MM][MM],pre[MM][MM],lcis[MM];//lcis为最长公共上升子序列
int ans=-1;//ans为最长公共上升子序列长度
void getLcis()
{
int x=n1,y=0,cnt=1,i,j,k;
mem(dp,0),mem(pre,0);
for(i=1;i<=n1;i++)
{
k=0;
for(j=1;j<=n2;j++)
{
if(a[i]!=b[j]) dp[i][j]=dp[i-1][j];
if(a[i]>b[j]&&dp[i][j]>dp[i][k]) k=j;
if(a[i]==b[j]) dp[i][j]=dp[i][k]+1,pre[i][j]=k;
}
}
for(i=1;i<=n2;i++)
if(dp[n1][i]>ans) ans=dp[n1][i],y=i;
while(dp[x][y])
{
if(a[x]!=b[y]) x--;
else lcis[ans-cnt]=b[y],cnt++,y=pre[x][y];
}
}
int main()
{
sca(n1);
for(int i=1;i<=n1;i++)
sca(a[i]);
sca(n2);
for(int i=1;i<=n2;i++)
sca(b[i]);
getLcis();
pri(ans);
for(int i=0;i<ans;i++)
printf("%d ",lcis[i]);
puts("");
return 0;
}
最新文章
- linux命令 - ln - 创建和删除软、硬链接
- iOS开发——数据持久化Swift篇&;(三)SQLite3
- Page.ClientScript.RegisterStartupScript
- MVVM in Depth
- 转:Selenium2.0介绍——WebDriver两种驱动浏览器的方式.
- 基于Angularjs实现图片上传和下载
- NYOJ 67 三角形面积(线代,数学)
- 201521123113《Java程序设计》第14周学习总结
- OC的内存管理和@class
- Java正则表达式小记
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化
- java 基础 字符类型
- 【转】 cJSON 源码解析
- Unity 发送游戏画面到 Winform
- 如何在unity中使用龙骨动画
- struct timeval结构体 以及 gettimeofday()函数(转)
- VC/Wince 实现仿Win8 Metro风格界面1——设计概述和自绘Button(附效果图)
- jquery 中的回调函数,回调函数(callback)是什么?
- 最小生成树(Kruskal和Prim算法)
- C#调用Excel报 error CS1969: 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?