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

    1.Python中注释,有助于我们对程序的理解:但注释不需要每行都写,可以在方法前面注释该方法的功能 或重要的一行进行注释. 2.单行注释,使用#号: 3.多行注释,使用""&qu ...

  2. [置顶] 云端TensorFlow读取数据IO的高效方式

    低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行T ...

  3. PHP 反引号运行Shell命令,C程序

    /********************************************************************* * PHP 反引号运行Shell命令,C程序 * 说明: ...

  4. SimpliciTI无线开发 — 快速搭建低功耗、低成本无线传感器网络

    一.初闻SimpliciTI SimpliciTI是TI在2007年宣布推出的针对小型简单RF网络的专有低功耗协议,因其简化了具体的实施操作,降低对微控制器资源的占用,故基于SimpliciTI的RF ...

  5. 模块(Modules)

    一.引入模块 模块:当编写更大的应用程序时,所有的代码肯定会分成多个文件,这样便于维护,另外已经编写好的函数和对象在被多个程序中使用时,不用把函数和对象拷贝到每个程序中. 模块支持以上功能,在Pyth ...

  6. ZOJ3329One Person Game(循环型 数学期望)

    There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. ...

  7. 每天一个linux命令:【转载】ls命令

    ls命令是linux下最常用的命令.ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单,如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...

  8. WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)

    不知从什么时候开始,头像流行使用圆形了,于是各个平台开始追逐显示圆形裁剪图像的技术.WPF 作为一个优秀的 UI 框架,当然有其内建的机制支持这种圆形裁剪. 不过,内建的机制仅支持画刷,而如果被裁剪的 ...

  9. 接口测试框架——第二篇-python读取excel文件内容

    今天完善excel_module.py文件,上代码: # coding: utf-8 import xlrd class ReadExcel(): def __init__(self, file_na ...

  10. .NET程序下载获得的ContentLength=-1

    你写的.NET(C#)下载程序是否会遇到过这样的问题?--ContentLength=-1. 例如,有如下代码: HttpWebRequest webRequest = (HttpWebRequest ...