hdu1506 dp

 1 //Accepted    1428 KB    62 ms
 2 //
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6 using namespace std;
 7 const int imax_n = 100005;
 8 int l[imax_n];
 9 int r[imax_n];
10 int a[imax_n];
11 int n;
12 void Dp()
13 {
14     l[1]=1;
15     a[0]=-1;
16     for (int i=2;i<=n;i++)
17     {
18         int t=i;
19         while (a[i]<=a[t-1])
20         {
21             t=l[t-1];
22         }
23         l[i]=t;
24     }
25     r[n]=n;
26     a[n+1]=-1;
27     for (int i=n-1;i>=1;i--)
28     {
29         int t=i;
30         while (a[i]<=a[t+1])
31         {
32             t=r[t+1];
33         }
34        r[i]=t;
35     }
36     __int64 ans=0;
37     for (int i=1;i<=n;i++)
38     {
39         if ((__int64 )a[i]*(r[i]-l[i]+1)>ans)
40         ans=(__int64 )a[i]*(r[i]-l[i]+1);
41     }
42     printf("%I64d\n",ans);
43 }
44 int main()
45 {
46     while (scanf("%d",&n),n)
47     {
48         for (int i=1;i<=n;i++)
49         scanf("%d",&a[i]);
50         Dp();
51     }
52     return 0;
53 }

hdu1506 dp,布布扣,bubuko.com

时间: 2024-11-03 01:18:35

hdu1506 dp的相关文章

HDU 1505 City Game (hdu1506 dp二维加强版)

F - City Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1505 Appoint description: Description Bob is a strategy game programming specialist. In his new city building game the gaming enviro

hdu1506(dp减少重复计算)

可以算出以第i个值为高度的矩形可以向左延伸left[i],向右延伸right[i]的长度 那么答案便是 (left[i] + right[i] + 1) * a[i] 的最大值 关键left[i] 和right[i]的计算 如果a[i] > a[i-1]  ,  那么left[i] = 0 如果a[i] <=a[i-1],  那么left[i] = left[i-1] + 1,   但是位置i-1-left[i-1]-1及其往左的元素没有比较过,所以需要继续去比较 同理right[i]的计算也

hdu1506(dp求最大子矩阵)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 分析: 对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1: 我们从左到右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了. #include <cstdio> #include <cstring> #include <

DP总结 ——QPH

常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一头压入元素. 队列中维护的是两个值.一个是位置,这和k的范围有关系,另外一个是f(k)的值,这个用来维护单调性,当然如果f(k)的值可以利用dp值在O(1)的时间内计算出来的话队列中可以只维护一个表示位置的变量. 枚举到一个i的时候,首先判断队首元素的位置是否已经不满足k的范围了,如果不满足就将队首

HDU1505(HDU1506的加强版)

昨天打 CF又跪了,最近睡不好睡不好睡不好-感觉整个人都累傻了,根本无办法写下去,仅仅写了一题签到题就跪了orz..从未试过这么悲剧. 今天早上凭着我的意念("怨念"),七点又起来了!我已经连续好多天七点自动起来(不是自然醒,是意念,是意念....),刷啊刷啊刷dp. 今天刷的是昨天的加强版,实际上就多了一个for循环,和做高度处理,不直到是不是正解(  ╮(╯▽╰)╭ ),但是AC就好了... 经过多次调试我的shell脚本,这个acm.sh算是比较稳定了,还差一个自动提交机啊!我的

hdu1505 dp

1 //Accepted 5196 KB 109 ms 2 //类似hdu1506 3 //输入数据的格式没有明确的限制 4 //可能出现以下情况 5 //5 5 6 //R 7 //F 8 //F F F 9 //F F F F F 10 //R R R 11 //R R 12 //R F R F R 13 //R R R R R 14 #include <cstdio> 15 #include <cstring> 16 #include <iostream> 17

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&