CH5101 LCIS【线性dp】
5101 LCIS 0x50「动态规划」例题
描述
熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了。
小沐沐说,对于两个数列A和B,如果它们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列,而所有的公共上升子序列中最长的就是最长公共上升子序列了。
奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子序列。不过,只要告诉奶牛它的长度就可以了。数列A和B的长度均不超过3000。
输入格式
第一行N,表示A,B的长度。
第二行,串A。
第三行,串B。
输出格式
输出长度。
样例输入
4
2 2 1 3
2 1 2 3
样例输出
2
数据范围与约定
- 1<=N<=3000,A,B中的数字不超过2^31-1
Contest Hunter - 信息学自助比赛平台
LIS与LCS问题的结合
dp[i][j]表示A1-Ai和B1-Bj中以Bj为结尾的LCIS的长度
那么当Ai != Bj 时 显然dp[i][j] = dp[i-1][j]
当Ai == Bj时 判断1-j中是否有Bk < Bj 取所有可能解的最大值加一
找k时可以for循环跑 那么总的复杂度是n^3
优化的算法是对于每一个i A[i]都没有变化 每次j增加 可能解的数量是递增的
每一次都记录当前j的最大可能解就可用于下一次更新了
“在实现状态转移方程时,要注意观察决策集合的范围随着状态的变化情况。对于“决策集合中的元素只增多不减少的”的情景,就可以像本题一样维护一个变量来记录决策集合的当前信息,避免重复扫描”
很坑的是第三组数据好像个数有问题还是怎么的?反正我输出时多了一个\n就WA,去掉\n就过了
n^2算法
//#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring> using namespace std;
typedef long long int LL; const int maxn = ;
int A[maxn], B[maxn];
int n;
int dp[maxn][maxn]; int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d", &A[i]);
for(int i = ; i <= n; i++)
scanf("%d", &B[i]); //memset(dp, 0, sizeof(dp));
for(int i = ; i <= n; i++){
int val = ;
for(int j = ; j <= n; j++){
if(A[i] == B[j]){
dp[i][j] = val + ;
}
else{
dp[i][j] = dp[i - ][j];
}
if(B[j] < A[i]) val = max(val, dp[i - ][j]);
}
} int ans = ;
for(int i = ; i <= n; i++){
ans = max(ans, dp[n][i]);
}
//cout<<endl;
printf("%d", ans);
//scanf("%d", &n);
return ;
}
n^3算法
//#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring> using namespace std;
typedef long long int LL; const int maxn = ;
int A[maxn], B[maxn];
int n;
int dp[maxn][maxn]; int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d", &A[i]);
for(int i = ; i <= n; i++)
scanf("%d", &B[i]); //memset(dp, 0, sizeof(dp));
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++){
if(A[i] == B[j]){
for(int k = ; k < j; k++){
if(B[k] < A[i])
dp[i][j] = max(dp[i - ][k] + , dp[i][j]);
}
}
else{
dp[i][j] = dp[i - ][j];
}
}
} int ans = ;
for(int i = ; i <= n; i++){
ans = max(ans, dp[n][i]);
}
//cout<<endl;
printf("%d", ans);
//scanf("%d", &n);
return ;
}
CH5101 LCIS【线性dp】的更多相关文章
- TYVJ1071 LCIS 线性DP+决策集优化
问题描述 TYVJ1071 题解 暴力\(\mathrm{DP}\) 首先,一个\(O(n^3)\)的解法: 设\(opt_{i,j}\)代表\(a\)的前\(i\)个和\(b\)的前\(j\)个的\ ...
- 线性DP总结(LIS,LCS,LCIS,最长子段和)
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- DP基础(线性DP)总结
DP基础(线性DP)总结 前言:虽然确实有点基础......但凡事得脚踏实地地做,基础不牢,地动山摇,,,嗯! LIS(最长上升子序列) dp方程:dp[i]=max{dp[j]+1,a[j]< ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
随机推荐
- struts2拦截器的实现原理及源码剖析
拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...
- php7性能、兼容性和稳定性探讨
前几天看到php7发布了beta1版本,想了解一下php7到底折腾了些啥东西出来.这一了解发现不得了了,改变还挺多的.最最重要的方面就是性能提升了不少,这边有一个pdf文件是惠新宸(鸟哥,php核心开 ...
- zend server 和zend studio 最佳实践
1.zend server 安装好后需要重启下.无论是win还是mac..win不重启组件不能用.mac 不重启守护进程是离线的 2.修改apache配置.的根目录.到zendstudio的工作空间 ...
- UITableView__cell 距tableview顶端有间距
UITableView__cell 距tableview顶端有间距 如何去掉这个间距呢?解决方法如下: //top 为cell距顶端的间距 (一般为负值) self.formTable.con ...
- 06、Windows 10 技术预览
随着 Windows 10 发布的,未来 Windows 平台都是统一开发模型,可以只写一个 Appx 包,就可以同时部署到 Windows/ Windowsw Phone/ Tablet /xbox ...
- 从零开始,跟我一起做jblog项目(一)引言
从零开始,跟我一起做jblog项目(一)引言 想做一个java版的blog,源自一个很久之前的想法 当时刚学习JAVA的web编程 想买自己的域名,自己的VPS,安装自己的WEB服务 用google ...
- Python 列表的操作
list基本操作 #coding=utf-8 #列表 string = 'list' #字符串->列表 list1 = list(string) # ['l', 'i', 's', 't'] # ...
- java 解压.gz文件
1.//建立gzip压缩文件输入流 2.建立gzip解压工作流 fileInputStream = new FileInputStream(filePath + fileName); //解凍する G ...
- Hbase分布式安装部署过程
系统 Red hat linux 6.4 Hadoop版本 1.2.1 Hbase版本 0.94.16 Hbase的完全分布式安装概述: 1. 配置hosts,确保涉及的主机名均可解析为ip 2. 编 ...
- nginx的 keepalive_timeout参数是一个请求完成之后还要保持连
keepalive_timeout参数是一个请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于线程池,数据库连接池. [root@web01 ...