【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS
很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目。
第一问:求最少改变几个数能把一个随机序列变成单调上升序列。
\(Solution:\)似乎是一个结论?如果两个数\(A_i\)和\(A_j\)可以保留(\(i > j, A_i > A_j\)),即中间其他数都可以通过修改成为\([A_i, A_j]\)区间内的一个数,那么一定有\(i - j <= A_i - A_j\),即\(A_i - i >= A_j - j\)。这个东西我们可以设为数列\(B\),求一个最长不下降子序列就可以了。
(其实我中间智障了写成了最长上升子序列居然还有\(90ptshhhhh\))
第二问:结论看这里。有了第一问的铺垫其实并不难想,但是问题在于可以有很多种最长不下降子序列,该怎么办?
我们考虑对答案\(DP\),设\(f_x\)为前\(x\)个数有序化的最小代价(其中\(x\)一定是一个子序列内的点),然后来一发轻松愉快的\(DP\)。由于数据完全随机,所以可以剪枝过去。(虽然就是不随机恐怕也很难卡满就是了\(QwQ\))
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 35000 + 5;
const int INF = 0x3f3f3f3f;
int n, A[N], B[N], Longest[N];
vector <int> q, G[N];
vector <int> :: iterator it;
int solve1 () {
for (int i = 1; i <= n + 1; ++i) {
if (q.empty () || B[i] >= q[q.size () - 1]) {
q.push_back (B[i]); Longest[i] = q.size ();
} else {
it = upper_bound (q.begin (), q.end (), B[i]);
*it = B[i]; Longest[i] = it - q.begin () + 1;
}
G[Longest[i]].push_back (i);
}
// Longest[i] : 以 i 结尾的最长不下降子序列
return q.size () - 1; // 可以保留的数的个数
}
int dp[N], hl[N], hr[N]; // hl[i] -> 从 l 到 i 都选择变成左端点值的代价, hr 同理
int solve2 () {
memset (dp, 0x3f, sizeof (dp));
dp[0] = 0; G[0].push_back (0);
for (int v = 1; v <= n + 1; ++v) {
for (int i = 0; i < G[Longest[v] - 1].size (); ++i) {
int u = G[Longest[v] - 1][i];
// cout << "u = " << u << " v = " << v << endl;
if (v < u || B[v] < B[u]) continue;
hl[u] = hr[v] = 0;
for (int k = u + 1; k < v; ++k) {
hl[k] = hl[k - 1] + abs (B[k] - B[u]);
}
for (int k = v - 1; k > u; --k) {
hr[k] = hr[k + 1] + abs (B[k] - B[v]);
}
for (int k = u; k < v; ++k) {
dp[v] = min (dp[v], dp[u] + hl[k] + hr[k + 1]);
}
}
}
return dp[n + 1];
}
signed main () {
// freopen ("data.in", "r", stdin);
// freopen ("data.out", "w", stdout);
cin >> n;
B[0] = -INF, B[n + 1] = INF;
for (int i = 1; i <= n; ++i) {
cin >> A[i]; B[i] = A[i] - i;
}
cout << n - solve1 () << endl; // 对数列 B 做最长不下降子序列
cout << solve2 () << endl; // ans
}
【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS的更多相关文章
- 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)
2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...
- Luogu P2501 [HAOI2006]数字序列
题目 首先把\(a\)改成严格单调上升等于把\(a_i-i\)改成单调不降. 那么第一问可以直接做LIS,答案就是\(n-\)LIS的长度. 同时我们记录一下序列中每个位置结尾的LIS长度. 第二问我 ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- BZOJ1049:[HAOI2006]数字序列(DP)
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...
- P2501 [HAOI2006]数字序列 (LIS,DP)(未完成)
第二问好迷... #include "Head.cpp" #include <vector> const int N = 35007; vector<int> ...
- p2501 [HAOI2006]数字序列
传送门 分析 https://www.luogu.org/blog/FlierKing/solution-p2501 对于第二问的感性理解就是有上下两条线,一些点在上面的线的上面或者下面的线的下面,然 ...
- [luogu2501 HAOI2006] 数字序列 (递推LIS)
题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. 输入输出格式 输入格式: 第一行包含一个数 ...
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
随机推荐
- YAML基础知识及搭建一台简洁版guestbook
一,前言 前面我们已经搭建过简易版k8s集群了,在此基础上可以搭建一个简洁版guestbook ,以便来学习k8s创建pod的整个过程. 二,在此之前,我们还需要学习一下YAML基础知识 YAML 基 ...
- RN 图片处理 resizeMode
Image组件必须在样式中声明图片的宽和高.如果没有声明,则图片将不会被呈现在界面上. 我们一般将Image定义的宽和高乘以当前运行环境的像素密度称为Image的实际宽高. 当Image的实际宽 ...
- 支付宝API
1. 业务场景描述:在我们的爱旅行项目中,用户只有报名并且付款之后才能算作参加旅行团成功,因此必须提供快速便捷的支付功能:这里,我们选择了阿里的支付宝api来实现快捷支付,基于此,我们向蚂蚁金服发起申 ...
- git(程序员的时光机)
git 是什么 最强大的分布式版本控制系统,没有之一 版本控制: 完成一项任务,最终的成果可能是经过中间修修修改n次得到的,在这n个版本之间的切换就叫版本控制. 集中式的版本控制svn,cvs缺点: ...
- Django学习笔记(二)URL编写规则
先在根目录以及每个app内添加一个空白的urls.py(此处根目录指项目同名文件夹内).程序收到用户请求时,先在根目录的urls.py查找该URL属于哪个app,再从app的urls.py找到具体的U ...
- Kali Linux 2019.2使用华为源
一.将默认的配置源注释掉 root@zinuo:~# vim /etc/apt/sources.list 注释: #deb http://http.kali.org/kali kali-rolling ...
- 论文阅读 | Towards a Robust Deep Neural Network in Text Domain A Survey
摘要 这篇文章主要总结文本中的对抗样本,包括器中的攻击方法和防御方法,比较它们的优缺点. 最后给出这个领域的挑战和发展方向. 1 介绍 对抗样本有两个核心:一是扰动足够小:二是可以成功欺骗网络. 所有 ...
- [python] a little deep learning case
from numpy import exp, array, random, dot class NeuralNetwork(): def __init__(self): random.seed(1) ...
- myeclipse中jpa的安装以及jpa reverse engining
myeclipse中jpa的安装以及jpa reverse engining 安装 右击 Configure Facets, Install JPA jpa reverse engining 1.db ...
- CNN中feature map、卷积核、卷积核的个数、filter、channel的概念解释
CNN中feature map.卷积核.卷积核的个数.filter.channel的概念解释 参考链接: https://blog.csdn.net/xys430381_1/article/detai ...