两次单调队列求出每个子矩阵的最小值,区间减法求出每个子矩阵的和,然后丢到优先队列里跑出来就好了。
写锉了,加了读入挂才过。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(linker,...
分类:
其他好文 时间:
2014-10-30 11:47:20
阅读次数:
344
第一个单调队列优化dp写了半天,最后初始化搞错了还一直wa。。题目大意:炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股且一次交易后至少要间隔w天才能再次交易,初始有0股,本金无限,求最大收益题解:dp[i][j]表示第 i 天,有 ...
分类:
其他好文 时间:
2014-10-28 19:22:54
阅读次数:
169
题意:一个V * U的矩阵,每个元素有一个高度Hxy,问长不超过100,且最高值与最低值的差不超过C的子矩阵的最大面积(1
题目链接:http://poj.org/problem?id=1156
——>>枚举子矩阵的左右宽度(保证枚举宽度不超过100,同时记录所枚举左右区间的每行的最大最小值),再枚举子矩阵的上下宽度(用单调队列优化判C)。
#include
#include
#inc...
分类:
其他好文 时间:
2014-10-22 14:39:19
阅读次数:
175
题目:给你一排建筑的长度和高度,求最长的上横高度和下降高度。
分析:dp,最大上升子序列。
说明:有长度,不能直接用单调队列优化。
#include
#include
#include
using namespace std;
int h[2000],w[2000],u[2000],l[2000];
int main()
{
int T,n;
while (~scanf("%...
分类:
其他好文 时间:
2014-10-19 18:42:40
阅读次数:
192
题目大意:给定一个m*n的地图,一些点有障碍物,钢琴初始在一个点,每个时间段可以选择向给定的方向移动一段距离,求最长路径长
朴素DP的话,我们有T个时间段,每个时间段有m*n个点,n个时间,一定会超时
考虑到一个时间段所有的更新操作都是相同的,我们可以考虑单调队列优化
设队尾为(x,y),新插入的点为(x',y'),那么当Distance( (x,y) , (x',y') )
四遍单调队...
分类:
其他好文 时间:
2014-10-14 15:06:31
阅读次数:
227
题目用优先队列优化普通的广搜就可以过了。#include#include#includeusing namespace std;#includestruct pq{ int x,y,val; friend bool operator b.val; }};priority_queu...
分类:
其他好文 时间:
2014-10-09 02:41:07
阅读次数:
148
第一题:题目大意:多重背包。解题过程:1.二进制拆分。最慢的点0.5s。2.单调队列优化会更快,不过我不会。。第二题:题目描述:给定一个n×m的矩阵,记录左上角为(1,1),右下角为(n,m),现在从(1,1)开始取数,每次只能向下或向右移动一个单位,最终到达(n,m),我们把路径上所有的数相乘,结...
分类:
其他好文 时间:
2014-10-02 15:36:53
阅读次数:
327
题目:求一个01矩阵中的最大有全是1的矩形面积,列可以任意互换。
分析:dp。zoj2180类似题,计算前 K行的最大值时,先按高度排序即可。
这里利用单调队列优化了查询算法,即保存一个区间的最小高度维护即可;
最大的面积为max(最小高度*区间长度),T(N)= N^2 log(N)。
说明:(2011-09-19 08:10)。
#in...
分类:
移动开发 时间:
2014-09-22 10:46:42
阅读次数:
202
题目:统计一个字母矩阵中最大的相同字母的面积,有些字母可以换成其他字母。
分析:dp,单调队列。计算分三种分别换成a,b,c求出最大的子矩阵,求出最大即可。
然后就是单调队列优化的查询算法了,确定每个点右(左)边第一个比他小的点;
T(N)=O(N^2)。
说明:(2011-09-19 08:15)。
#include
#include...
分类:
其他好文 时间:
2014-09-22 09:22:42
阅读次数:
206
POJ 3017 Cut the Sequence (单调队列优化DP)
ACM
题目地址:
POJ 3017 Cut the Sequence
题意:
将一个由N个数组成的序列划分成若干段,要求每段数字的和不超过M,求【每段的最大值】的和 的最小的划分方法,输出这个最小的和。
分析:
方程是:dp[i] = min(dp[j]+maxsum[j+1][i]) ...
分类:
其他好文 时间:
2014-09-18 19:00:54
阅读次数:
165