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> ...
随机推荐
- iOS图片上传及处理
从摄像头或者是从相冊中读取图片.须要通过UIImagePickerController类来实现,在使用UIImagePickerController时,须要是实现以下两个协议 <UINaviga ...
- bash的输出多行和vim的全部选择
使用cat命令加输出符>来在bash脚本里面输出多行文本是最直观的做法. cat >out.file <<EOF start a line ... ... a line aga ...
- NYOJ 467 中缀式变后缀式
做了表达式求值那道题之后做的 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后 ...
- SCWS 中文分词
SCWS 中文分词v1.2.3 开源免费的中文分词系统,PHP分词的上乘之选! 首页 下载 演示 文档 关于 服务&支持 API/HTTP 论坛 捐赠 源码@github 文档目录 SCWS- ...
- hdu1331(记忆化搜索)
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typed ...
- java中,scala中代码检测当前环境的版本
//来自spark源码// sparkContext初始化的时候写着 private def warnDeprecatedVersions(): Unit = { val javaVersion = ...
- DDR2基础
一. DDR2介绍 DDR2由JEDEC(电子设备工程联合委员会)开发的新生代内存技术标准.该标准定义了DDR2封装.寻址及操作.电气等所有特性. DDR相关技术对比 DDR DDR2 DDR3 电压 ...
- RabbitMQ之发布订阅【译】
在上一节中我们创建了一个工作队列,最好的情况是工作队列能够把任务恰到好处的分配给每一个worker.这一节中我们将做一些完全不同的事情--将消息传递给每一个消费者,这种模式被称为发布/订阅. 为了说明 ...
- zend Studio10.6.2破解注册码
下载破解包:http://download.csdn.net/detail/gsls200808/7982115 安装方法:破解的jar文件com.zend.verifier_10.6.2.v2014 ...
- 常用cmd
net use 查询相应的共享文件 control userpasswords2--修改计算机的网络凭证 删除计算机记录的网络共享凭证 重启网络