题目链接:

http://www.codeforces.com/contest/10/problem/D

D. LCIS

time limit per test:1 second
memory limit per test:256 megabytes

问题描述

This problem differs from one which was on the online contest.

The sequence a1, a2, ..., an is called increasing, if ai < ai + 1 for i < n.

The sequence s1, s2, ..., sk is called the subsequence of the sequence a1, a2, ..., an, if there exist such a set of indexes 1 ≤ i1 < i2 < ... < ik ≤ n that aij = sj. In other words, the sequence s can be derived from the sequence a by crossing out some elements.

You are given two sequences of integer numbers. You are to find their longest common increasing subsequence, i.e. an increasing sequence of maximum length that is the subsequence of both sequences.

输入

The first line contains an integer n (1 ≤ n ≤ 500) — the length of the first sequence. The second line contains n space-separated integers from the range [0, 109] — elements of the first sequence. The third line contains an integer m (1 ≤ m ≤ 500) — the length of the second sequence. The fourth line contains m space-separated integers from the range [0, 109] — elements of the second sequence.

输出

In the first line output k — the length of the longest common increasing subsequence. In the second line output the subsequence itself. Separate the elements with a space. If there are several solutions, output any.

样例

input

7

2 3 1 6 5 4 6

4

1 3 5 6

output

3

3 5 6

题意

求最长公共递增子序列,并输出一个最优解。

题解

dp[j]表示第一个串的前i个和第二个串的前j个的以b[j]结尾的公共最长上升子序列的长度。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int maxn = 555; int dp[maxn];
int a[maxn], b[maxn];
int pre[maxn];
int n, m; void print(int i) {
if (!i) return;
print(pre[i]);
printf("%d ", b[i]);
} void init() {
memset(dp, 0, sizeof(dp));
memset(pre, 0, sizeof(pre));
} int main() {
init();
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
scanf("%d", &m);
for (int i = 1; i <= m; i++) scanf("%d", &b[i]);
int ans = 0, st = 0;
for (int i = 1; i <= n; i++) {
int pos = 0;
for (int j = 1; j <= m; j++) {
if (b[j]<a[i] && dp[pos]<dp[j]) {
pos = j;
}
else if (a[i] == b[j]) {
dp[j] = dp[pos] + 1;
pre[j] = pos;
}
//这样边扫边记会wa,还没找到原因。。
//if (ans<dp[j]) {
// ans = dp[j], st = j;
//}
}
}
for (int i = 1; i <= m; i++) {
if (dp[i] > ans) {
ans = dp[i], st = i;
}
}
printf("%d\n", ans);
print(st);
return 0;
}

再一发:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn=555;
const int maxm=555; int a[maxn],b[maxn];
int dp[maxn][maxn],pre[maxn][maxn]; int main() {
int n;
scf("%d",&n);
for(int i=1;i<=n;i++) scf("%d",&a[i]);
int m;
scf("%d",&m);
for(int i=1;i<=m;i++) scf("%d",&b[i]); clr(dp,0);
clr(pre,0); for(int i=1;i<=n;i++){
int ma=0,p=0;
for(int j=1;j<=m;j++){
dp[i][j]=dp[i-1][j];
pre[i][j]=pre[i-1][j];
if(a[i]==b[j]){
if(dp[i][j]<ma+1){
dp[i][j]=ma+1;
pre[i][j]=p;
}
}else if(b[j]<a[i]){
if(ma<dp[i-1][j]){
ma=dp[i-1][j];
p=j;
}
}
}
} int ans=0,pos=0;
for(int i=1;i<=m;i++){
if(ans<dp[n][i]){
ans=dp[n][i];
pos=i;
}
}
VI lis;
lis.pb(pos);
int p=pre[n][pos];
while(p){
lis.pb(p);
p=pre[n][p];
}
reverse(lis.begin(),lis.end());
printf("%d\n",ans);
if(ans==0) return 0;
rep(i,0,lis.sz()-1) prf("%d ",b[lis[i]]);
prf("%d\n",b[lis[lis.sz()-1]]);
return 0;
} //end----------------------------------------------------------------------- /*
3 1 2 3
3 3 4 5
*/

Codeforces Beta Round #10 D. LCIS的更多相关文章

  1. Codeforces Beta Round #10 D. LCIS 动态规划

    D. LCIS 题目连接: http://www.codeforces.com/contest/10/problem/D Description This problem differs from o ...

  2. Codeforces Beta Round #10 D. LCIS(DP&amp;LCIS)

    D. LCIS time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  3. Codeforces Beta Round #10 C. Digital Root 数学

    C. Digital Root 题目连接: http://www.codeforces.com/contest/10/problem/C Description Not long ago Billy ...

  4. Codeforces Beta Round #10 B. Cinema Cashier 暴力

    B. Cinema Cashier 题目连接: http://www.codeforces.com/contest/10/problem/B Description All cinema halls ...

  5. Codeforces Beta Round #10 A. Power Consumption Calculation 水题

    A. Power Consumption Calculation 题目连接: http://www.codeforces.com/contest/10/problem/A Description To ...

  6. Codeforces Beta Round #10 B. Cinema Cashier (树状数组)

    题目大意: n波人去k*k的电影院看电影. 要尽量往中间坐,往前坐. 直接枚举,贪心,能坐就坐,坐在离中心近期的地方. #include <cstdio> #include <ios ...

  7. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  8. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  9. Codeforces Beta Round 84 (Div. 2 Only)

    layout: post title: Codeforces Beta Round 84 (Div. 2 Only) author: "luowentaoaa" catalog: ...

随机推荐

  1. SQL批量修改表名

    SELECT NAME FROM SYS. ALL_OBJECTS WHERE TYPE= 'U' ORDER BY MODIFY_DATE DESC --查询所有表名 SELECT NAME FRO ...

  2. Shell脚本报错unary operator expected

    在匹配字符串时用了类似这样的语句 if[ $timeofday = "yes"]; then echo "Good morning" exit 0 报错的原因是 ...

  3. CAS Ticket SSO 登录流程图

  4. Cookie和Session简介与区别

    1.Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用Cookie与 ...

  5. 【学习笔记】【C语言】函数

    一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...

  6. 20141104--SQL连接查询,联合查询

    ---------------------------连接查询-------------------------------- --横向连接查询 --可以将子查询放在from之前,用来替换显示出来的信 ...

  7. angularjs中的directive

    正在初学angularjs中,在网上看到一篇详细讲解directive指令的文章,于是就记录在这里和大家一起分享 angular.module('docsTransclusionExample', [ ...

  8. virtualbox安装增强包及配置共享文件夹

       因为需要在host及虚拟机间传输数据,想使用共享文件夹.但是单独设置了共享文件夹后在centos里找不到共享文件夹,看了下要安装增强包.好吧,顺 便也解决下鼠标切换的问题,省的老是按右CTL切换 ...

  9. copy con

      在DOS系统中,一些计算机设备也有文件名,叫做设备文件,可以用对应的文件名来操作它.后来的WINDOWS也保留了这些设备文件.比如con表示console(控制台,简单的说就是键盘和屏幕),com ...

  10. 【风马一族_git_github】使用Github搭建个人网站

    个人网站 访问 https://用户名.github.io  ( 风马一族的Github网站 ) 搭建步骤 1)创建个人站点-->新建仓库(注:仓库名必须是[用户名.github.io]) 2) ...