Codeforces Beta Round #10 D. LCIS
题目链接:
http://www.codeforces.com/contest/10/problem/D
D. LCIS
time limit per test:1 secondmemory 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 6output
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的更多相关文章
- Codeforces Beta Round #10 D. LCIS 动态规划
D. LCIS 题目连接: http://www.codeforces.com/contest/10/problem/D Description This problem differs from o ...
- Codeforces Beta Round #10 D. LCIS(DP&LCIS)
D. LCIS time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Beta Round #10 C. Digital Root 数学
C. Digital Root 题目连接: http://www.codeforces.com/contest/10/problem/C Description Not long ago Billy ...
- Codeforces Beta Round #10 B. Cinema Cashier 暴力
B. Cinema Cashier 题目连接: http://www.codeforces.com/contest/10/problem/B Description All cinema halls ...
- Codeforces Beta Round #10 A. Power Consumption Calculation 水题
A. Power Consumption Calculation 题目连接: http://www.codeforces.com/contest/10/problem/A Description To ...
- Codeforces Beta Round #10 B. Cinema Cashier (树状数组)
题目大意: n波人去k*k的电影院看电影. 要尽量往中间坐,往前坐. 直接枚举,贪心,能坐就坐,坐在离中心近期的地方. #include <cstdio> #include <ios ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #13 C. Sequence (DP)
题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...
- Codeforces Beta Round 84 (Div. 2 Only)
layout: post title: Codeforces Beta Round 84 (Div. 2 Only) author: "luowentaoaa" catalog: ...
随机推荐
- SQL循环
加群学习:457351423 这里有4000多部学习视频,有需要的欢迎进群学习! declare @temp Table ( nf varchar(50), yf varchar(50), sm va ...
- SQL 复制订阅 异常后 强制删除
最近做数据库同步备份工作,将 主库 通过SQLService 自带的 [复制] 订阅出去后,因为 订阅方(从库) 发生异常,主库 无法确定 从库的订阅,就想清理了,订阅重新做同步,结果.....主库上 ...
- mac(osx) apache无法启动 localhost无法访问服务器[]
问题描述:由于删除了/private/var/log下面的日志,导致重启电脑后apache无法正常工作. 删除log的初衷是:当系统用久了,日志文件占据了几十个G的硬盘容量. 造成的后果:重启电脑后a ...
- [Apache Maven Shade Plugin] [example] [001] 官方例子:includes-excludes
链接地址:[Selecting Contents for Uber JAR](http://maven.apache.org/plugins/maven-shade-plugin/examples/i ...
- 状态模式(State)
状态模式,从字面意思上来讲应该是很简单的,就是针对实际业务上的内容,当类的内部的状态发生改变时,给出不同的响应体,就像现实中的人一样,早上没有吃饭,状态不好,上班.上课都会打哈欠,中午了,吃过午饭,又 ...
- unity打包android游戏部分问题总结
一:虚拟导航栏挡到游戏按钮: 解决方案如下: 1.获取焦点的时候隐藏 虚拟导航条 Navigation bar 隐藏导航条 2.出现导航条的时候,改变游戏界面大小 Unity tidbits: cha ...
- Ubuntu14.04 安装 PHP cURL
今天遇到 Fatal error: Call to undefined function curl_init() in /xxx/xxxx/www/application/library/Ku/Htt ...
- nginx安装总结
对于nginx作为负载均衡服务器时的安装需要安装rewrite模块需要的pcre()库,gzip模块需要zlib库,ssl模块需要openssl库,对此依赖安装有很多种处理方式,以下简单总结: 通过源 ...
- 跨域名设置cookie或获取cookie
可以使用jquery里面的ajax中的jsonp的方式来访问就可以了.代码如下: $.ajax({ url: 'your url', data: {'xx' : 'xx', 'xx2' : 'xx2' ...
- PHP操作MongoDB简明教程(转)
转自:http://blog.sina.com.cn/s/blog_6324c2380100ux2m.html MongoDB是最近比较流行的NoSQL数据库,网络上关于PHP操作MongoDB的资料 ...