Codeforces Beta Round #10 D. LCIS(DP&LCIS)
1 second
256 megabytes
standard input
standard output
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 aby
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 nspace-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.
7
2 3 1 6 5 4 6
4
1 3 5 6
3
3 5 6
5
1 2 0 2 1
3
1 0 1
2
0 1
题意:
给你长度分别为n,m(1<=n,m<=500)的序列。要你求这两个序列的最长公共上升子序列。
思路:
最长公共子序列做过。最长上升子序列也做过。可是这题时最长公共上升子序列。。。解法肯定还是dp拉。
感觉这题的dp方程的思想非常不错,体现了一种加强约束的思想。dp[i][j]表示。处理完A序列的前i个,且上升序列以B序列的B[j]结尾的最长子序列。感觉这个把状态体现以什么结尾是非常不错的思想。然后转移显而易见了。
if(A[i]==B[j])
dp[i][j]=dp[i-1][k];//k是小于j且B[k]<B[j]
else
dp[i][j]=dp[i-1][j];
我们能够i,j循环这样就能够省掉找k的时间。复杂度O(n*m)
具体见代码:
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=100010;
typedef long long ll;
int dp[550][550],A[550],B[550],path[550][550],n,m;
bool print(int x)
{
if(!x)
return false;
if(print(path[n][x]))
printf(" %d",B[x]);
else
printf("%d",B[x]);
return true;
}
int main()
{
int i,j,tp,ans,pos;
while(~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]);
memset(dp,0,sizeof dp);
for(i=1;i<=n;i++)
{
tp=pos=0;
for(j=1;j<=m;j++)
{
dp[i][j]=dp[i-1][j];
path[i][j]=path[i-1][j];
if(A[i]==B[j]&&tp+1>dp[i][j])
dp[i][j]=tp+1,path[i][j]=pos;
if(B[j]<A[i]&&dp[i-1][j]>tp)
tp=dp[i-1][j],pos=j;
}
}
ans=1;
for(i=1;i<=m;i++)
if(dp[n][i]>dp[n][ans])
ans=i;
printf("%d\n",dp[n][ans]);
if(dp[n][ans])
print(ans);
printf("\n");
}
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
Codeforces Beta Round #10 D. LCIS(DP&LCIS)的更多相关文章
- Codeforces Beta Round #13 C. Sequence (DP)
题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...
- Codeforces Beta Round #10 D. LCIS
题目链接: http://www.codeforces.com/contest/10/problem/D D. LCIS time limit per test:1 secondmemory limi ...
- 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 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 #17 C. Balance (字符串计数 dp)
C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input ou ...
- Codeforces Beta Round #71 C【KMP+DP】
Codeforces79C 题意: 求s串的最大子串不包含任意b串: 思路: dp[i]为以i为起点的子串的最长延长距离. 我们可以想到一种情况就是这个 i 是某个子串的起点,子串的长度-1就是最短, ...
- Codeforces Beta Round #96 (Div. 2) (A-E)
写份DIV2的完整题解 A 判断下HQ9有没有出现过 #include <iostream> #include<cstdio> #include<cstring> ...
随机推荐
- 关闭linux终端命令行退格报警声(centos7亲测有效)
首先这个声音不是外置音频设备发出,而是主板上的蜂鸣器 1,使用root账户登录 2,vi 打开 ~/.bashrc 脚本 3,在脚本的最后一行加上 setterm -blength 0 4,保存脚本 ...
- destoon代码从头到尾捋一遍
destoon® B2B网站管理系统(以下简称destoon)由西安嘉客信息科技有限责任公司独立研发并推出,对其拥有完全知识产权,中国国家版权局计算机软件著作权登记号:2009SR037570. 系统 ...
- TCP/IP笔记 应用层(2)——FTP
1. FTP(File Transfer Protocol) 文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务.FTP 的主要功能是减少或消除在不同操作系统下处理文 ...
- X-window
X-Window(也常称为X11或X)系统是一种以位图方式显示的软件视窗系统,最初是1984年麻省理工学院的研究,之后变成UNIX.类UNIX. 以及OpenVMS等操作系统所一致适用的标准化软件工具 ...
- WPF之 XAML集合项简单演示
我们直接通过xaml文件演示一个简单的xaml集合项: <Window x:Class="WPF_XAML集合项.MainWindow" xmlns="http:/ ...
- Word 2016 test
Word 2016 test
- AlertDialog中EditText不能获取焦点以及不宽度不能自动铺满的完美解决方案
问题分析: 因为 dialog的Attributes使用的默认的,其中一个属性就是:flags ,就是这个属性导致不能获取焦点,默认的是FLAG_NOT_FOCUSABLE,故名思义不能获取输入焦点, ...
- ASP.NET MVC轻教程 Step By Step 6——改进表单
上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.B ...
- 学习Swift -- 数组(Array) - 持续更新
集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方 ...
- 一些有用的 Emacs 配置(窗口快速切换、一键透明效果、任意位置删除整行等)
本篇文章记录的是一些有用的 Emacs 配置,有些是自己原创,有些是借鉴别人(能记起来出处的我放了链接). 规定:C 代表 Ctrl,M 代表 Alt. 1.设置一次跳跃 n 行的快捷键 按 C-M- ...