最长上升子序列模型 AcWing 1010. 拦截导弹
最长上升子序列模型 AcWing 1010. 拦截导弹
原题链接
AcWing 1010. 拦截导弹
算法标签
DP 线性DP 最长上升子序列
思路
摘自该题解
代码
#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
const int N = 1005, INF = 0x3f3f3f3f;
// f1[i]表示此时第i套导弹拦截系统所拦截的最后一个导弹的高度
int f[N], f1[N], a[N];
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;
}
void put(int x) {if(x<0) putchar('-'),x=-x;if(x>=10) put(x/10);putchar(x%10^48);
}
vector<string> get(string str){vector<string> res;string word;for (auto c: str){if (c == ' '){res.push_back(word);word = "";}else word += c;}res.push_back(word);return res;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);string s;getline(cin, s);vector<string> v=get(s);int ans=0, cnt=0, n=v.size();// cnt代表现有子序列长度rep(i, 0, n){a[i]=stoi(v[i]);}// 以i结尾下降序列rep(i, 0, n){f[i]=1;rep(j, 0, i){if(a[j]>=a[i]){f[i]=max(f[i], f[j]+1);}}ans=max(ans, f[i]);int k=0;while(k<cnt&&f1[k]<a[i]){k++; } // a[i]开创一套新拦截系统 if(k==cnt){f1[cnt++]=a[i]; } // a[i]成为第k套拦截系统最后一个导弹高度else{f1[k]=a[i]; }}printf("%lld\n%lld\n", ans, cnt);
}
y总代码
#include <sstream>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1010;int n;
int h[N], f[N], q[N];int main()
{string line;getline(cin, line);stringstream ssin(line);while (ssin >> h[n]) n ++ ;int res = 0, cnt = 0;for (int i = 0; i < n; i ++ ){f[i] = 1;for (int j = 0; j < i; j ++ )if (h[i] <= h[j])f[i] = max(f[i], f[j] + 1);res = max(res, f[i]);int k = 0;while (k < cnt && q[k] < h[i]) k ++ ;if (k == cnt) q[cnt ++ ] = h[i];else q[k] = h[i];}printf("%d\n", res);printf("%d\n", cnt);return 0;
}
tips
读入处理
输入流高级语法
string line;getline(cin, line);stringstream ssin(line);while (ssin >> h[n]) n ++ ;
或
while (cin >> h[ ++ n]);
最长上升子序列模型 AcWing 1010. 拦截导弹相关推荐
- AcWing 1010 拦截导弹
题目描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度. 某天,雷达捕捉到敌国 ...
- AcWing 1010. 拦截导弹
好久没写啦, 今天学acwing打算分享一下拦截导弹这样一道lis题目, 方法就是dp和贪心 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能 ...
- 拦截导弹(dp【最长上升子序列模型】 + 贪心)
AC Wing 1010 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度 ...
- [AcWing] 1012. 友好城市(C++实现)最长上升子序列模型、较为特殊
[AcWing] 1012. 友好城市(C++实现)最长上升子序列模型 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...
- ACwing 895 - 最长上升子序列(最长上升子序列模型)
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 1 ≤ N ≤ ...
- 【动态规划专题】最长上升子序列模型
题目 算法 A.AcWing 895. 最长上升子序列 模板 B.AcWing1017. 怪盗基德的滑翔翼 最长上升子序列/最长下降子序列 C.AcWing 1014. 登山 最长上升子序列/最长下降 ...
- C++---最长上升子序列模型---导弹防御系统(每日一道算法2023.3.5)
注意事项: 本题的dp:"线性dp-最长上升子序列的长度" 本题的贪心(单调队列):"最长上升子序列模型-拦截导弹" 下面思路只讲如何运用这些东西来解这道题 强 ...
- 最长上升子序列(acwing 895 acwing 896 acwing1017)
文章目录 理解 acwing 895 最长上升子序列 acwing 896 最长上升子序列2 acwing 1017 怪盗基德的滑翔翼 理解 是动态规划的题目,就是找一个数组中存在的连续的子序列. 最 ...
- 最长上升子序列模型之拦截导弹
相关题目: 最长上升子序列 怪盗基德的滑翔翼 友好城市 登山 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是 ...
最新文章
- 跟小博老师一起学Servlet ——Servlet之HttpServletResponse
- 笑傲江湖霍建华版电子相册
- 一张图解释什么是遗传算法_一张图告诉你什么叫真正的满配m416,吃鸡玩家看懵了...
- Codeforces 313
- android按钮周围阴影,Android 上的按钮填充和阴影
- java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
- 梅特勒托利多电子秤显示EEP服务器错误,梅特勒-托利多电子天平常见故障的解决方法...
- 元学习算法MAML论文详解
- 可信计算理论与技术--远程证明技术
- android自动连接wifi,Android自动连接WiFi优先级规则,以及查看已连接WiFi的密码
- Rhino学习教程——1.2
- Python爬虫常用库requests、beautifulsoup、selenium、xpath总结
- 微信小程序 计算两点及多点间的距离+选择地图定位
- 磁盘管理器中不显示新增的硬盘
- LACP负载分担配置
- window.print打印部分无法显示
- 计算机视觉——KNN算法以及手势识别应用
- css怎么设置z坐标,CSS 定位(postion、z-index)
- Qt编写地图综合应用22-动态轨迹
- 硬件加密框架ocf cryptodev-linux介绍