洛谷 P1020 导弹拦截(dp+最长上升子序列变形)
参考资料:
[1]:LIS详解1
[2]:LIS详解2
相关概念解释:
1.串 & 子序列
一个串的子串是指该串的一个连续的局部。
如果不要求连续,则可称为它的子序列。
比如对串: "abcdefg" 而言,"ab","abd","bdef" 等都是它的子序列。
特别地,一个串本身,以及空串也是它的子序列。
2.最长上升子序列 & 最长不下降子序列
最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。
而最长不下降子序列则不一定要保证单调递增,只要保证 a[ i ] <= a[ j ] ( j > i , 且在序列范围内)即可。
现在开始回归主题:
题意:
中文题意,不再赘述;
题解:
第一问求最长不上升子序列的长度;
第二问求这个序列里面最少有多少最长不上升子序列。
难点就在与第二问,如何求呢?
看大佬博客说“求一个序列里面最少有多少最长不上升序列等于求这个序列里最长上升序列的长度”,我也不懂为啥 /小纠结,或许,这就是大佬吧。
废话少说,上AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e5+; int n;
int a[maxn];
int dp[maxn]; void Solve()
{
int len=;
dp[len]=INF;
for(int i=;i <= n;++i)
{
if(a[i] <= dp[len])
dp[++len]=a[i];
else
{
int l=,r=len+;
while(r-l > )//二分出最后一个不小于 a[i] 的下标
{
int mid=(l+r)/;
if(dp[mid] >= a[i])//注意,此处取到"=="判给了 l
l=mid;
else
r=mid;
}
dp[r]=a[i];
}
}
printf("%d\n",len);
len=;
dp[len]=-;
for(int i=;i <= n;++i)//求最长上升子序列
{
if(a[i] > dp[len])
dp[++len]=a[i];
else
{
int t=lower_bound(dp+,dp+len+,a[i])-dp;
dp[t]=a[i];
}
}
printf("%d\n",len);
} int main()
{
while(~scanf("%d",&a[++n]))//以回车结束输入的输入方式
continue;
n--;
Solve();
}
bug:
(1):输入方式
正确的输入方式:
while(~scanf("%d",&a[++n]))//以回车结束输入的输入方式
continue;
n--;//最后一个 n 接受的是 '\n' ,所以需要减去错误的输入方式,返回 RE,至今不知道为啥,有知道的大佬可否告知一二%%%%%%%%
do
{
scanf("%d",&a[++n]);
}while(getchar() != '\n');第一种输入方式在本地无法测试,但 OJ 可以。
第二种输入方式,虽然本地可以测试,但提交后返回 RE,应该是输入停不下来的吧。
分割线:2019.6.3
对第二问有了深一步的理解;
第二问求得是最少需要多少导弹拦截系统,根据贪心的思想,每个导弹系统都希望可以拦截尽可能多的导弹;
那么第一个导弹拦截系统最多可以拦截 cnt1 个,cnt1 = 最长不上升子序列的长度;
第二个导弹拦截系统最多可拦截 cnt2 个,cnt2 = 去掉第一次拦截的导弹后的最长不上升子序列的长度;
.............
第x个导弹拦截系统最多可拦截 cntx 个,cntx = 去掉前(x-1)次拦截的导弹后的最长不上升子序列长度;
假设第一次拦截的最低的导弹高度为 a1;
第二次拦截的最低的导弹高度为 a2;
..............
第x次拦截的最低导弹高度为 ax;
那么,a1 < a2 < ... < ax;
用反证法证明:
假设 ai > aj ( i<j );
那么,在第 i 次拦截中结尾的不应该是 ai,而应该是比 ai 还小的 aj;
但已经假设 ai 是第 i 次拦截中的最低导弹高度,与假设矛盾;
所以,第二问求的是最长上升子序列;
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e5+; int n;
int a[maxn];
int tmp[maxn];
int d[maxn]; void Solve()
{
int k=n;
for(int i=;i <= n;++i)
tmp[i]=a[k--]; int cnt=;
d[cnt]=-;
for(int i=;i <= n;++i)
{
if(tmp[i] >= d[cnt])
d[++cnt]=tmp[i];
else
{
int t=upper_bound(d+,d+cnt+,tmp[i])-d;
d[t]=tmp[i];
}
}
printf("%d",cnt); cnt=;
for(int i=;i <= n;++i)
{
if(a[i] > d[cnt])
d[++cnt]=a[i];
else
{
int t=lower_bound(d+,d+cnt+,a[i])-d;
d[t]=a[i];
}
}
printf(" %d\n",cnt); return ;
}
int main()
{
// freopen("C:/Users/14685/Desktop/stdin&&stdout/contest","r",stdin);
n=;
while(~scanf("%d",&a[++n]));
n--;
Solve(); return ;
}
洛谷 P1020 导弹拦截(dp+最长上升子序列变形)的更多相关文章
- codevs1044 拦截导弹==洛谷 P1020 导弹拦截
P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天 ...
- 洛谷 - P1020 - 导弹拦截 - 最长上升子序列
https://www.luogu.org/problemnew/show/P1020 终于搞明白了.根据某定理,最少需要的防御系统的数量就是最长上升子序列的数量. 呵呵手写二分果然功能很多,想清楚自 ...
- 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...
- 洛谷 P1020导弹拦截题解
洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- 洛谷P1020 导弹拦截【单调栈】
题目:https://www.luogu.org/problemnew/show/P1020 题意: 给定一些导弹的高度. 一个导弹系统只能拦截高度不增的一系列导弹,问如果只有一个系统最多能拦截多少导 ...
- codevs——T1044 拦截导弹 || 洛谷——P1020 导弹拦截
http://codevs.cn/problem/1044/ || https://www.luogu.org/problem/show?pid=1020#sub 时间限制: 1 s 空间限制: 1 ...
- 洛谷P1020导弹拦截——LIS
题目:https://www.luogu.org/problemnew/show/P1020 主要是第二问,使用了dilworth定理:一个序列中最长不上升子序列的最大覆盖=最长上升子序列长度. di ...
- 洛谷P1020 导弹拦截 题解 LIS扩展题 Dilworth定理
题目链接:https://www.luogu.com.cn/problem/P1020 题目大意: 给你一串数,求: 这串数的最长不上升子序列的长度: 最少划分成多少个子序列是的这些子序列都是不上升子 ...
- 洛谷 P1020 导弹拦截
题目传送门 解题思路: 其实就是求一遍最长不上升子序列和最长上升子序列 AC代码: #include<iostream> #include<cstdio> #include&l ...
随机推荐
- zifutongji
第三次作业要求我们自己写程序,我算我们班写的比较晚的了,我听他们写的都是在文件中写一段代码,然后读出来.我们班大部分都是,所以,我就想可不可以跟他们不一样呢,写一个属于自己的思路. 所以我想到了数组. ...
- Daily Scrum NO.9
工作概况 符美潇 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.根据第二小组的要求对数据库表的属性进行修改. 今日工作 1.Daily Scrum.日常会议及日常工 ...
- 接口(interface)与多态
1. 接口(interface)是抽象方法与常量值的集合: 2. 从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量与方法的定义,而没有变量和方法的实现: 3. 接口中声明的属性默认为:pu ...
- Spring MVC静态资源处理(转)
原文地址: http://www.cnblogs.com/fangqi/archive/2012/10/28/2743108.html 优雅REST风格的资源URL不希望带 .html 或 .do 等 ...
- 微信小程序navigator
如果是小程序自身页面的跳转 <navigator open-type="navigate" target="self" url="target ...
- java数值运算后精度丢失问题
最近连续俩次遇到运算后数值精度丢失问题,所以记录一下. 问题1:java计算百分比,应该得到57,可返回的就是56 在java代码中 BigDecimal progress; BigDecimal a ...
- org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: c
//这个是 配置文件放错了地方 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing ...
- PAT (Basic Level) Practice 1001 害死人不偿命的(3n+1)猜想
https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528 卡拉兹(Callatz)猜想: 对任何一个自 ...
- Delphi7通过superobject解析JSON
1.通过delphi程序访问PHP事先写好的webservice(查询功能),webservice返回json格式数据. 2.通过superobject读取json数据 得到效果如下: //深层级的访 ...
- java基础知识点罗列
1:Java泛型 2:clone Java中的深拷贝(深复制)和浅拷贝(浅复制) Java中对Clone的理解 序列化和反序列化的概念 3:Java中有关Null的9件事