POJ 2127

 1 #include <iostream>
 2 #define MAXN 501
 3 using namespace std;
 4
 5 int a[MAXN],b[MAXN],ans[MAXN];
 6
 7 int GCIS(int l1, int *a, int l2, int *b);
 8
 9 int main()
10 {
11     //freopen("acm.acm","r",stdin);
12     int l_1;
13     int l_2;
14     int i;
15     int j;
16     int ans_max;
17 //    cin>>l_1;
18     scanf("%d",&l_1);
19
20     for(i = 0; i < l_1; ++ i)
21     {
22     //    cin>>a[i];
23         scanf("%d",&a[i]);
24     }
25
26 //    cin>>l_2;
27     scanf("%d",&l_2);
28     for(i = 0; i < l_2; ++ i)
29     {
30         //cin>>b[i];
31         scanf("%d",&b[i]);
32     }
33
34     cout<<(ans_max = GCIS(l_1,a,l_2,b) )<<endl;
35
36     for(i = 0; i < ans_max; ++ i)
37     {
38         cout<<ans[i]<<" ";
39     }
40     cout<<endl;
41
42 }
43
44
45 /////////////////////////////////////
46 //最长公共上升子序列~
47 /////////////////////////////////////
48 int GCIS(int l1, int *a, int l2, int *b)//ans[0...DP[max]-1]为序列,最长公共递增子序列!
49 {
50     int f[MAXN+1][MAXN+1];
51     int DP[MAXN+1];
52     int i,j,k,max;
53     memset(f,0,sizeof(f));
54     memset(DP,0,sizeof(DP));
55     for (i=1;i<=l1;i++)
56     {
57         k=0;
58         for(int kk = 1;kk <= l2;++ kk)
59         {
60             f[i][kk] = f[i-1][kk];
61         }
62         for (j=1;j<=l2;j++)
63         {
64             if(b[j-1] < a[i-1] && DP[j] > DP[k])
65                 k=j;
66             if(b[j-1]==a[i-1]&&DP[k]+1>DP[j])
67             {
68                 DP[j]=DP[k]+1;
69                 f[i][j]=i*(l2+1)+k;
70             }
71         }
72     }
73     max=0;
74     for(i=1;i<=l2;i++)
75     {
76         if (DP[i]>DP[max])
77         max=i;
78     }
79     i=l1*l2+l1+max;
80     for(j = DP[max];j > 0;j --)
81     {
82         ans[j-1] = b[i%(l2+1)-1];
83         i=f[i/(l2+1)][i%(l2+1)];
84     }
85     return DP[max];
86 }
87 ///////////////////////////////////////////////////
88 //返回值是子序列的容量,容器为ans[]
89 ///////////////////////////////////////////////////
时间: 2024-10-10 20:46:27

POJ 2127的相关文章

POJ 2127 最长公共上升子序列

动态规划法: #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #inc

poj 2127 lcis wa

#include<iostream> #include<cstdio> #include<stack> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int maxn = 505; const ll one = 1; const ll inf = one << 32; ll n1, n2, a[maxn],

POJ 2127 LCIS DP

http://poj.org/problem?id=2127 #include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <cstdio> #include <map> #include <vector> using namespace std; const int N=5e2+20; const int inf

DP题目

//HDU 4001 To Miss Our Children Time HDU 4433 locker HDU 4362 Dragon Ball[] HDU 3602 2012[] HDU 4385 Moving Bricks[] HLG 1067 QQ Farm[] HDU 4293 Groups HDU 3920 Clear All of Them I[] HDU 3466 Proud Merchants[] POJ 2923 Relocation[] HDU 3660 Alice and

LICS O(n*m)+前驱路径

LICS:最长公共上升子序列: 一般令f[i][j]表示a串前i位,b串以j结尾的LICS长度.于是,答案为:max(1~m)(f[n][i]); 朴素做法:O(n^3) 相等时,从1~j-1枚举最大值. for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {if(a[i]!=b[j]) f[i][j]=f[i-1][j]; else if(a[i]==b[j]) for(int k=1;k<j;k++) if(b[k]<b[j]) f[i][j

POJ 3449 Geometric Shapes --计算几何,线段相交

题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一步来吧. 还有收集了一个线段旋转的函数. Vector Rotate(Point P,Vector A,double rad){ //以P为基准点把向量A旋转rad return Vector(P.x+A.x*cos(rad)-A.y*sin(rad),P.y+A.x*sin(rad)+A.y*co

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348