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

    转载自:点击打开链接 静态路由是在路由器中设置的固定的路由表.除非网络管理员干预,否则静态路由不会发生变化.由于静态路由不能对网络的改变作出反映,一般用于网络规模不大.拓扑结构固定的网络中.静态路由的 ...

  2. zookeeper的c API 单线程与多线程问题 cli_st和cli_mt

    同样的程序,在centos和ubuntu上都没有问题,在solaris上问题却多多,据说是solaris管理更加严格. zookeeper_init方法,在传入一个错误的host也能初始化出一个非空的 ...

  3. c# 数据库批量插入数据SqlBulkCopy 示例

    /// <summary> /// 批量插入数据 /// </summary> public static void SqlBulkInsert(DataTable dt, s ...

  4. websocket基本概念

    (1)websocket 协议 与 http协议 websocket 协议,双工通道 socket连接不断开 http 协议 ,只能请求响应 (用户主动获取) socket连接断开 都是基于socke ...

  5. 从JDK源码角度看Boolean

    Java的Boolean类主要作用就是对基本类型boolean进行封装,提供了一些处理boolean类型的方法,比如String类型和boolean类型的转换. 主要实现源码如下: public fi ...

  6. Vim技能修炼教程(6) - 行编辑器

    在很久很久以前,计算机的运算能力还很弱,终端与主机的通信也不好.在没有显示器的时代,只能通过电传打字机跟主机通信.那时候只有行编辑器,编辑的时候只能在一行中进行.需要显示哪一行,就把哪一行或者哪几行打 ...

  7. SpreadJS 在 Angular2 中支持哪些事件?

    SpreadJS 纯前端表格控件是基于 HTML5 的 JavaScript 电子表格和网格功能控件,提供了完备的公式引擎.排序.过滤.输入控件.数据可视化.Excel 导入/导出等功能,适用于 .N ...

  8. Ubuntu在图形界面和命令行界面都循环登录解决办法

    在做机器ip变化自动发送邮件的时候,在/etc/profile.d/目录下添加了一个脚本,重启的时候就循环登录了,无论是在图形界面还是命令行界面. 解决方法:利用系统U盘进入系统进行修改,具体如下: ...

  9. DevOps实践

    云计算 [ 01 ]GitLab+Rancher实践DevOps[转载] [ 02 ]Kubernetes CentOS 7.4搭建Kubernetes 1.8.5集群 kubeadm搭建kubern ...

  10. Git 过滤文件,控制上传

    在Git的版本控制中,可能有些文件是不需要加入控制的,那我们在提交代码时就需要忽略这些文件,下面讲讲应该怎么给Git配置一些忽略规则. 有三种方法可以忽略掉这些文件,这三种方法都能达到目的,只不过适用 ...