解题思路:这题的本质就是:求一个给定的数字序列中,非递增(或非递减)子序列的最少的条数。
思维误区:本题很容易被样例坑,以为是直接求跳跃点(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. document和javaScript内置对象

    1.Document 属性: referrer //返回载入当前文档的URL URL //返回当前文档的URL 方法: getElementById(); //根据id获取html元素对象 getEl ...

  2. Java数据封装类

    项目中用到,比较好用!! 用户前端与后台的交互数据,这个封装类中包含分页.数据.错误码.状态码等信息!! 亲测好用哦! 一个类DataWrapper public class DataWrapper& ...

  3. TCP、UDP详解

    OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...

  4. js实现百度,淘宝搜索功能

        Common.js //封装类名 function byClassName(sClassName){ if(document.getElementsBYClassName){ return d ...

  5. scrapy与scrapyd安装

    Scrapy是用python编写的爬虫程序. Scrapyd是一个部署与运行scrapy爬虫的应用,提供JSON API的调用方式来部署与控制爬虫 . 本文验证在fedora与centos是安装成功. ...

  6. 用两个stack实现一个队列

    class Queue { stack<int> input, output; public: void push(int x) { input.push(x); } void pop(v ...

  7. UVALive - 4108 SKYLINE (吉司机线段树)

    题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi ...

  8. 监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  9. BZOJ1066 SCOI2007 蜥蜴 【网络流-最大流】

    BZOJ1066 SCOI2007 蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离 ...

  10. Roslyn 的确定性构建

    注意到每次编译完之后,你的 dll 或者 exe 是不一样的吗?本来这并没有什么大不了的,但大家都知道数字和鹅厂的安全软件遍布在我们大(tiān)陆(cháo)地区的大量电脑上,它们的查杀策略是——凡 ...