hdu1423LCIS zoj2432 必须掌握!
LCIS就是最长上升公共子序列,要结合LIS和LCS来求
LIS:f[j]=max(f[i])+1;
LCS:f[i,j]=max(f[i-1,j],f[i,j-1]或f[i-1,j-1]+1
那么对于LCIS,定义f[i][j]是以B[j]为结尾的最长公共上升子序列长度,
如果A[i]!=B[j],那么f[i][j]=f[i-1][j],
否则 f[i][j]=max(d[i-1][k])+1;1<=k<=j-1
最后扫描一次f[n][j],找到最大的
zoj2432需要用pre数组保存前驱pre[i][j]表示以b[j]结尾的上一个字符在b中的下标,即记录LCIS并输出
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<string.h>
using namespace std;
const int maxn = + ;
#define LL long long
int n, m;
LL a[maxn], b[maxn];
int f[maxn][maxn];
int pre[maxn][maxn]; int main()
{
int T; cin >> T;
while (T--) {
scanf("%d", &n);
for (int i = ; i <= n; ++i) scanf("%lld", a + i);
scanf("%d", &m);
for (int i = ; i <= m; ++i) scanf("%lld", b + i);
memset(pre, -, sizeof(pre));
memset(f, , sizeof(f));
for (int i = ; i <= n; ++i) {
int v = , k = ;
for (int j = ; j <= m; ++j) {
// pre[i][j] = pre[i - 1][j];
f[i][j] = f[i - ][j];
if (a[i] > b[j] && v < f[i - ][j]) v = f[i - ][j], k = j;
if (a[i] == b[j] && v + >f[i][j]) f[i][j] = v + , pre[i][j] = k;
}
}
int k = ;
for (int i = ; i <= m; ++i)
if (f[n][i]>f[n][k]) k = i;
printf("%d\n", f[n][k]);
if (f[n][k] == ) continue;
int i = n;
vector<int> ans;
for (int i = n; i >= ;--i)
if (pre[i][k] != -) ans.push_back(a[i]), k = pre[i][k];
printf("%d", ans.back());
for (int i = ans.size() - ; i >= ; --i) printf(" %d", ans[i]);
printf("\n");
}
}
hdu1423LCIS zoj2432 必须掌握!的更多相关文章
- zoj2432 hdoj1423 最长公共上升子序列(LCIS)
zoj2431 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2432 hdoj 1423 http://acm.hdu. ...
- zoj2432
/* 首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度. 状态转移方程: if(A[i]==B[j]) dp[i][j]=max( ...
- OJ题目分类
POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...
随机推荐
- models.DateTimeField(auto_now_add=True) 与 models.DateTimeField(auto_now=True)
DateTimeField和DateField和TimeField存储的内容分别对应着datetime(),date(),time()三个对象. 对于auto_now=False和auto_now_a ...
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. 天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊! oracle的分析函数over ...
- Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- 设计模式---对象创建模式之工厂方法模式(Factory Method)
前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...
- 学习windows编程 day3 之 自定义画笔的两种方法
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- Java编程思想 学习笔记2
二.一切都是对象 1.用引用操纵对象 在Java中,一切都被视为对象,但操纵的标识符实际上是对象的一个“引用”.可以将这想象成遥控器(引用)来操纵电视机(对象).另外,没有电视机,遥控器也可以单独存在 ...
- python 爆破
python 爆破 #!/usr/bin/python #-*- coding: GB2312 -*- #author:loversorry import urllib2 import urllib ...
- Spring Boot 启动过程及 自定义 Listener等组件
一.启动过程 二.自定义组件 package com.example.jdbc.listener; import org.springframework.context.ApplicationCont ...
- python自带的调试器
python是自带调试器的. 比如你写了一个python程序,名叫test.py. 你想调试一下这个程序,你可以执行 python -m pdb test.py,就会进入test.py的调试. 想查看 ...
- 教你如何使用android studio发布release 版本【转】
原文链接 想必还有人对如何在Android studio (以下简称as)发布release版本的app而狂刷百度吧?都是过来人,我很理解这种心情,百度到的基本是半成品,为什么这么说呢?百度一下,你就 ...