博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DP CF 319 div1B
阅读量:6579 次
发布时间:2019-06-24

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

http://codeforces.com/contest/319/problem/B

 

题目大意:

有删除操作,每次都删除数组右边比自己小的、且紧挨着自己的数字。问最小需要删除几次。

思路:

我们定义dp[i]表示删除右边的所有元素需要几次,然后用deque或者stack维护(最小的在顶端),从右边开始逆推(这样就保证了stack或deque中的数字在序列中的大小),然后在pop的同时要注意比较t和dp[j]的大小就可以了。

#include
using namespace std;const int maxn = 100000 + 5;int a[maxn];int dp[maxn];int n;void solve(){ memset(dp, 0, sizeof(dp)); stack
> s; s.push(make_pair(n - 1, a[n - 1])); for (int i = n - 2; i >= 0; i--){ int t = 0; pair
p; while (!s.empty() && s.top().second < a[i]){ p = s.top(); t = max(dp[p.first], t + 1); s.pop(); } s.push(make_pair(i, a[i])); dp[i] = t; } int cnt = 0; for (int i = 0; i < n; i++) cnt = max(cnt, dp[i]); cout << cnt << endl;}int main(){ while (scanf("%d", &n) == 1){ for (int i = 0; i < n; i++) scanf("%d", a + i); solve(); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/heimao5027/p/5645923.html

你可能感兴趣的文章
对向量、矩阵求导
查看>>
各版本linux下载地址大全
查看>>
CentOS 6.X 关闭不需要的 TTY 方法
查看>>
我的友情链接
查看>>
分区技术学习一
查看>>
Juniper 高级选项
查看>>
编程能力的四种境界
查看>>
编译安装mysql
查看>>
在windows上秒开应用程序
查看>>
【20180611】MySQL OOM
查看>>
memcached
查看>>
Python面向对象编程(一)
查看>>
决心书
查看>>
如何把图片上的文字转换成word?
查看>>
7z命令行
查看>>
C语言编程实现 输入一个非负整数,返回组成它的数字之和(递归方法)
查看>>
c3p0
查看>>
redis cluster 集群搭建(增、删、改、查) :5.0.2
查看>>
我的友情链接
查看>>
我的友情链接
查看>>