解题思路:这题的本质就是:求一个给定的数字序列中,非递增(或非递减)子序列的最少的条数。
思维误区:本题很容易被样例坑,以为是直接求跳跃点(i < j && ai < aj)的个数 + 1。其实,从样例本身来看,确实有这个嫌疑。不过不难想到8 500 300 400 200 80 200 100 50这样测试样例,明显地,如果求跳跃点的个数,这里有2个跳跃点,结果是3。但是,可以看出,子序列500
400 200 200 100 50
和子序列300 80才是符合题目要求的,结果应该是2。
自编测试样例:
8 389 207 155 300 299 170 158 65
1 100
6 300 200 400 200 100 500
8 500 300 400 200 300 100 200 50
8 500 300 400 200 80 200 100 50
8 500 300 400 200 80 500 100 50

AC代码:

#include<bits/stdc++.h>
using namespace std;
vector<int> nums;
int n;

void solve() {
    vector<int> dp;
    ;i < n;i++)dp.push_back();
    ;i < n;i++){
        ;j < i;j++){
            );
        }
    }

    ;
    ;i < n;i++)res = max(res, dp[i]);
    printf("%d\n", res);
}

int main() {
    //freopen("probCTDS.txt","r",stdin);
    int h;
    while(scanf("%d", &n) != EOF) {
        nums.clear();
        ; i < n; i++) {
            scanf("%d", &h);
            nums.push_back(h);
        }
        solve();
    }
    ;
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实际上,既然是求非递增子序列的最少的条数,那么,反过来想,就是求最长递增子序列的长度。为什么?因为在递增子序列中,每一个元素都是非递增子序列的开头元素。在求非递增子序列的最少的条数的时候,每次遇到最长递增子序列一个元素,就应该新起一个序列。是吧。
所以,可以优化算法,得到如下核心算法代码:
void solve(){
    fill(dp, dp + n, INF);
    ;i < n;i++)*lower_bound(dp, dp + n, a[i]) = a[i];
    printf("%d\n", lower_bound(dp, dp + n, INF) - dp);
}

为什么这样是对的呢?因为在求最长递增子序列的过程中,递增子序列的最后一个值越小,这个递增子序列越有利。

举个栗子:
数字序列为:1 3 5 7 9 2 4 6 8 10
对于上述算法,当i=4(对应的数字为9)时,dp中的值为:1 3 5 7 9 INF................
i++, i = 5(nums[i] = 2), 二分搜索dp, dp中>=2的元素就是3,位置为1,那么,2替换原来dp数组中的3。
同样,4就替换原来dp数组中的5。在此过程中可以发现,更小的元素会把更大的元素替换掉,使得后面的数字更有利。
注意:我们用这个算法求的的最长递增子序列的长度,求出的dp数组的值不一定是最长递增子序列。
比如:数组序列:1 3 5 7 9 2 4 6
最长递增子序列的长度为5,dp数组的值为:1 2 4 6 9。这显然不是最长递增子序列。但是,这个序列的长度确实是最长递增子序列的长度。
如果不清楚lower_bound和upper_bound函数的用法,请自行查找并掌握它们。

HDU1257题解的更多相关文章

  1. HDU-1257 最少拦截系统 贪心/DP 最长上升子序列的长度==最长不上升子序列的个数?

    题目链接:https://cn.vjudge.net/problem/HDU-1257 题意 中文题咯中文题咯 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然 ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. mac下iterm2快捷方式

    mac下iterm2,一些技巧,做个记录,大部分参考别人的加上自己的补充: 其中option + 左右键来跳转单词还是有问题,结果变为[D[C,等我摸索好了再来补充. 窗口 新建tab:⌘ + t 切 ...

  2. UE4中类自动生成代码解析

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/73189272 作者:car ...

  3. iad 集成三两事

    1. 好像是随着ios8的beta开始.  iad 已经发生了一些变化. 比如找不到enable iad network 的按钮了. 貌似是不需要手动去 enable 了. 只需要嵌入 iad fra ...

  4. iOS 网络编程(HTTP协议)

    HTTP协议的概念HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应 ...

  5. 人生苦短之我用Python篇(XML模块)

    XML模块 http://baike.baidu.com/link?url=-mBgvMdEDU7F05Pw7h_hBt7A0ctYiPm5a_WvKVLknydnRXKRIyydcVZWRjd_5H ...

  6. 特性属性 @property

    实现其它语言所拥有的 getter 和 setter 的功能 作用: 用来模拟一个属性 通过@property 装饰器可以对模拟属性的取值和赋值加以控制 class Student: def __in ...

  7. jquery动态增加或删除tr和td【实际项目】

    难点: (1)动态增加.删除tr和td (2)每天tr和td都有下标,且下标要动态变化, (3)tr和td为什么下标不能随便写,原因是此处需要把所有tr中的数据以list的形式发送到后台对象中,所有每 ...

  8. BZOJ2199 奶牛议会 【2-sat】

    BZOJ2199 奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以"每头牛 都可以获得自己想要的"为原则, ...

  9. iOS中scrollview自动滚动的实现

    http://bbs.csdn.net/topics/390347330 原问题是,我要展现给用户的内容放在scrollview中,让内容从上到底自动滚动,我最开始用的是DDAutoscrollvie ...

  10. 剑指offer第二章

    剑指offer第二章 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含 ...