问题描述

TYVJ1071


题解

暴力\(\mathrm{DP}\)

首先,一个\(O(n^3)\)的解法:

设\(opt_{i,j}\)代表\(a\)的前\(i\)个和\(b\)的前\(j\)个的\(\mathrm{LCIS}\).

显然有:

1.\(a_i=b_j\)

\[opt_{i,j}=opt_{i-1,j}
\]

2.\(a_i≠b_j\)

\[opt_{i,j}=max_{0 \le k < j,b_k<a_i} {opt_{i-1,k}}+1
\]

于是得到代码:

#include<bits/stdc++.h>
using namespace std; void read(int &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
} const int maxn=3007; int n;
int a[maxn],b[maxn],opt[maxn][maxn];
int ans;
int main(){
read(n);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) read(b[i]);
// opt[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i]!=b[j]) {opt[i][j]=opt[i-1][j];continue;}
for(int k=0;k<j;k++) if(b[k]<a[i]) opt[i][j]=max(opt[i][j],opt[i-1][k]+1);
}
}
for(int i=1;i<=n;i++) ans=max(opt[n][i],ans);
printf("%d\n",ans);
return 0;
}

这数据怎么这么水啊,怎么\(O(n^3)\)过\(3000\)啊。

决策集优化

发现这道题的\(\mathrm{DP}\)转移过程,已经在决策集中的决策点一定不会再出去,换而言之,这道题\(\mathrm{DP}\)的决策集是不断增大的。

于是考虑用一个变量\(val\)记录决策集中的最值,即可实现复杂度\(O(n^2)\)。

Code by lydrainbowcoat

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3006;
int n, a[N], b[N], f[N][N]; int main() {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
for (int i = 1; i <= n; i++) {
int val = 0;
for (int j = 1; j <= n; j++) {
f[i][j] = (a[i] == b[j] ? val + 1 : f[i-1][j]);
if (b[j] < a[i]) val = max(val, f[i-1][j]);
}
}
int ans = 0;
for (int j = 1; j <= n; j++) ans = max(ans, f[n][j]);
cout << ans << endl;
return 0;
}

总结——《算法竞赛进阶指南》

这道题的转移部分的优化告诉我们,在实现状态转移方程时,要注意观察决策集合的范围随着状态的变化情况。对于“决策集合中的预算只增多不减少”的情景,就可以像本题一样维护一个变量来记录决策集合的当前信息,避免重复扫描,把转移的复杂度降低一个量级。

TYVJ1071 LCIS 线性DP+决策集优化的更多相关文章

  1. LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化

    问题描述 LG2893 POJ3666 题解 对于\(A\)中的每一个元素,都将存在于\(B\)中. 对\(A\)离散化. 设\(opt_{i,j}\)代表\([1,i]\),结尾为\(j\)的最小代 ...

  2. [NOI2009]诗人小G(dp + 决策单调性优化)

    题意 有一个长度为 \(n\) 的序列 \(A\) 和常数 \(L, P\) ,你需要将它分成若干段,每 \(P\) 一段的代价为 \(| \sum ( A_i ) − L|^P\) ,求最小代价的划 ...

  3. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  4. Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化

    其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2​优化能过- CODE O(n3)O(n^3)O(n3) 先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2 ...

  5. bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)

    题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...

  6. Mowing the Lawn【线性dp + 单调队列优化】

    题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...

  7. P1912 [NOI2009]诗人小G[决策单调性优化]

    地址 n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小. 正常的dp决策单调性优化题目.不知道为什么luogu给了个黑题难度.$f[i]$表示最 ...

  8. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  9. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

随机推荐

  1. Vue 变异方法splice删除评论功能

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 怎样用cmd脚本添加Qt的环境变量

    在网上遍历了很久,终于找到了一个简单且令人满意的答案: 定位到PyQt5发布文件所需的plugins的位置: 新建一个名为“设置环境变量”的cmd脚本,在里面写上: wmic ENVIRONMENT ...

  3. ubuntu 查看版本

    cat /etc/proc 可以查看是16.04还是18.04

  4. Angular命令和基础操作

    本文档假设你已经熟悉了 HTML,CSS,JavaScript和来自最新标准的一些知识,比如类和模块. 一.Angular命令 命令语法: 大多数命令以及少量选项,会有别名.别名会显示在每个命令的语法 ...

  5. QFile 打开文件,不用先判断文件名是否为空,做这多余的工作

    void test_file() { QFile file(""); if (!file.open(QIODevice::WriteOnly)){ qDebug()<< ...

  6. Java 未来行情到底如何,来看看各界人士是怎么说的

    这是黄小斜的第102篇文章 作者 l 黄小斜 来源 l 公众号[程序员黄小斜](ID:AntCoder) 转载请联系作者(wx_ID:john_josh) Java从出生到现在已经走过了 20 多个年 ...

  7. win7 64bit安装redis

    win7 64bit安装redis 1 先安装redis客户端 1.下载Redis的压缩包 https://github.com/dmajkic/redis/downloads 我下载的是redis- ...

  8. Budgie Desktop in Linux 无法使用触摸板右键功能

    问题描述 Budgie桌面在Linux环境下很好用,不过最近发现触摸板的右键功能是不可用的 解决方法 经查阅Gnome官方文档(Budgie有很多功能基于Gnome)发现是Gnome官方把这个功能去掉 ...

  9. [Node.js] TypeScript 实现 sleep 函数

    看过不少网友的文章, 有各种方法, 但我想要的是一个能线性执行的sleep函数. /** * 等待指定的时间 * @param ms */ static async sleep(ms: number) ...

  10. Windows Server 2008 R2 install Visual Studio 2015 failed

    Please download and install Windows Server 2008 R2 Service Pack 1 (KB976932) . https://www.microsoft ...