博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA11456--dp,LIS
阅读量:5100 次
发布时间:2019-06-13

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

这道题是个不错的dp题,可以放在区域赛签到题或者铜牌题。

这题希望火车序列最长,我们可以想到,如果一辆车ai如果能被放上去,先不管之前放上了多少辆车,以及这辆车是什么时候放上去的,但是我们可以确定的是,以后能放的车的最大数量,这个是固定的,因为以后的车要么比ai大,要么比ai小,比ai大的放在ai的左边,比ai小的放在右面。但是可惜如果这辆车之前还有车的话,是会对以后产生影响的,所以我们想,如果这辆车是放上去的第一个就好了,注意是放上去的第一个而不是第一个放上去的,因为我可以放弃开头的一些车,等到后面才开始放,所以这个模型就是:

枚举以ai为第一辆被放上去的车,求他后面比他小和比他大的数,即以ai为开头,一直到结尾的最长上升and下降子序列。。。于是这就成了一道水题

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const int maxn = 1e5;int a[maxn];int d1[maxn],d2[maxn];int t,n;int main(){ for(cin>>t; t; t--) { memset(d1,0,sizeof(d1)); memset(d2,0,sizeof(d2)); scanf("%d",&n); for(int i = 0; i < n; ++i) { scanf("%d",a + i); } int maxlen = 0; for(int i = n-1; i >= 0; --i) { d1[i] = d2[i] = 1; for(int j = n-1; j > i; --j) { if(a[i] > a[j]) d1[i] = max(d1[i],d1[j] + 1); if(a[i] < a[j]) d2[i] = max(d2[i],d2[j] + 1); } maxlen = max(d1[i] + d2[i] - 1,maxlen); } printf("%d\n",maxlen); }}

 

转载于:https://www.cnblogs.com/Norlan/p/4872942.html

你可能感兴趣的文章
代理模式
查看>>
机器学习面笔试-SVM篇
查看>>
JS高级----------------->原型简单的写法(注意手动修改构造器的指向)
查看>>
vue响应式原理
查看>>
cocos2dx系列笔记(1)- windows环境配置前篇
查看>>
zoj 3870
查看>>
js设计模式之Module(模块)模式
查看>>
readme
查看>>
ES6 浅谈let与const 块级作用域之封闭空间(闭包)
查看>>
hdu 2059龟兔赛跑("01"背包)
查看>>
弹性布局辨析
查看>>
运行locate无法找到can not stat
查看>>
关于瀑布流
查看>>
poj 1338 Ugly Numbers
查看>>
sicily 1001. Alphacode
查看>>
poj 3013 Big Christmas Tree
查看>>
OffSet和Utc
查看>>
Linux上挂载NTFS分区
查看>>
ARST 第五周打卡
查看>>
python 要掌握面向对象,你得会做这些题
查看>>