博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP2004】合唱队形
阅读量:5367 次
发布时间:2019-06-15

本文共 1189 字,大约阅读时间需要 3 分钟。

本题在洛谷上的链接:


 

水题。。。没啥好说的,求一遍正向的最长上升子序列和一遍逆向的最长上升子序列就可以了。

唯一需要注意的是,求最长上升子序列之类的那种O(n^2)算法中,定义dp[i]是指以第i个元素为结尾的最长上升子序列长度,而O(nlogn)算法中,是指考虑到第i个元素所能产生的最长上升子序列长度,如果要使用O(nlogn)的做法,需要维护以当前元素结尾的最长上升子序列。但是,,,这题的范围也太小了,我写的O(nlogn)的做法咋还没O(n^2)快呢!!!

1 #include 
2 #include
3 4 using namespace std; 5 6 const int maxn = 105; 7 8 int h[maxn], dp[maxn], up[maxn]; 9 10 int main() {11 int n, len = 0, ans = 0;12 scanf("%d", &n);13 for (int i = 1; i <= n; ++i) {14 scanf("%d", &h[i]);15 if (h[i] > dp[len]) dp[++len] = h[i], up[i] = len;16 else {17 int pos = lower_bound(dp + 1, dp + len + 1, h[i]) - dp;18 dp[pos] = h[i], up[i] = pos;19 }20 }21 len = 0;22 for (int i = n; i >= 1; --i) {23 int down = 0;24 if (h[i] > dp[len]) dp[++len] = h[i], down = len;25 else {26 int pos = lower_bound(dp + 1, dp + len + 1, h[i]) - dp;27 dp[pos] = h[i], down = pos;28 }29 if (ans < up[i] + down) ans = up[i] + down;30 }31 printf("%d", n - ans + 1);32 return 0;33 }
AC代码

 

转载于:https://www.cnblogs.com/Mr94Kevin/p/9599732.html

你可能感兴趣的文章
The Cats' Feeding Spots
查看>>
YAML最最基础语法
查看>>
Python的datetime模块分析
查看>>
大数据时代:深入浅出微软数据挖掘算法系列
查看>>
500 服务器内部错误
查看>>
Docker常用命令
查看>>
How to use VideoToolbox to decompress H.264 video stream
查看>>
【转】Redundancy and Latency in Structured Buffer Use
查看>>
【转】The Basics of GPU Voxelization
查看>>
set类型的应用场景 —— Redis实战经验
查看>>
ASP.NET MVC 下自定义模型绑定,去除字符串类型前后的空格
查看>>
个人spring计划表及进行会议的时间、地址
查看>>
第2月第1天 命令(Command)模式
查看>>
LeetCode Reverse Words in a String II
查看>>
CSS之图片压盖效果案例分析
查看>>
dockerfile 指令
查看>>
Linux awk命令
查看>>
JS定义类或函数
查看>>
[ English ] Ping sb.
查看>>
牛客网暑期多校1
查看>>