poj 3017 Cut the Sequence(单调队列优化 )
2015-04-26 20:58
351 查看
题目链接:http://poj.org/problem?id=3017
题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小
分析:这题很快就能想到一个DP方程 f[ i ]=min{ f[ j ] +max{ a[ k ] }}( b[ i ]<j<i,j<k<=i) b[ i ]到 i的和大于m
这个方程的复杂度是O(n^2),明显要超时的(怎么discuss都说数据弱呢= =)
然后是优化了,首先当然是要优化一个最大值的队列,使得这个队列的队首元素的到当前位置的和不超过m,
这样一个可行解就是,f[ i ]=f[b[ i ]-1]+a[ q[ l ]](即队首元素的值),
这并不是最优解,所以还要找到队列中的最优解,一个可能的最优解只能是这样的
f[ q[ j ] ]+ a[ q[j +1 ]],也就是 a[ j ] 要大于后面的数,
很显然,如果a[ j ]小于后面的数,那么我们就可以将 a[ j ] 划分到后面去,而取得更优解
这里涉及的这个找最优解问题;
AC代码:
题意:给你一个长度为n的数列,要求把这个数列划分为任意块,每块的元素和小于m,使得所有块的最大值的和最小
分析:这题很快就能想到一个DP方程 f[ i ]=min{ f[ j ] +max{ a[ k ] }}( b[ i ]<j<i,j<k<=i) b[ i ]到 i的和大于m
这个方程的复杂度是O(n^2),明显要超时的(怎么discuss都说数据弱呢= =)
然后是优化了,首先当然是要优化一个最大值的队列,使得这个队列的队首元素的到当前位置的和不超过m,
这样一个可行解就是,f[ i ]=f[b[ i ]-1]+a[ q[ l ]](即队首元素的值),
这并不是最优解,所以还要找到队列中的最优解,一个可能的最优解只能是这样的
f[ q[ j ] ]+ a[ q[j +1 ]],也就是 a[ j ] 要大于后面的数,
很显然,如果a[ j ]小于后面的数,那么我们就可以将 a[ j ] 划分到后面去,而取得更优解
这里涉及的这个找最优解问题;
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; typedef long long LL; const int N = 100020; LL num ; LL sum ; LL f ; int q ; int main() { int n, i, j, st, ed, p; LL m; while(~scanf("%d%I64d", &n, &m)) { memset(f, -1, sizeof(f)); st = 0, ed = -1; p = 1; sum[0] = 0; f[0] = 0; for(i = 1; i <= n; ++i) { scanf("%I64d", num + i); sum[i] = sum[i-1] + num[i];// 统计前n项的和 if(st > ed) { st = 0, ed = -1; q[++ed] = i; } while(st <= ed && num[i] >= num[q[ed]]) --ed;//单调队列优化 q[++ed] = i; while(sum[i] - sum[p-1] > m) ++p; while(st <= ed && p > q[st]) st++;//单调队列里面保存的数已经被删除,则底部++; if(st > ed) continue; //当前队列为空了,直接返回 if(f[p-1] != -1) //如果当前p位,有数; f[i] = f[p-1] + num[q[st]]; for(j = st + 1; j <= ed; ++j) { if(f[q[j]-1] != -1) f[i] = min(f[i], f[q[j-1]] + num[q[j]]); } } printf("%I64d\n",f ); } return 0; }
相关文章推荐
- POJ 3017 Cut the Sequence(DP + 单调队列优化 + 平衡树)
- POJ 3017 Cut the Sequence (单调队列优化DP)
- poj 3017 Cut the Sequence(dp单调队列优化)
- POJ 3017 Cut the Sequence 【DP+单调队列优化+平衡树】
- POJ - 3017 Cut the Sequence : 单调队列优化dp
- POJ-3017 Cut the Sequence(DP单调队列优化 + 平衡树)
- Poj 3017 Cut the Sequence (DP,单调队列优化,数据结构优化)
- poj 3017 Cut the Sequence dp+单调队列优化
- poj 3017 Cut the Sequence(DP+单调队列)
- POJ_3017 Cut the Sequence 单调队列+dp+BST
- POJ 3017 Cut the Sequence(单调队列+set)
- POJ - 3017 Cut the Sequence(单调队列+dp)
- poj 3017 Cut the Sequence(DP+单调队列+set)
- POJ 3017 Cut the Sequence 单调队列
- POJ 3017|Cut the Sequence|动态规划|单调队列
- POJ Cut the Sequence 单调队列优化DP入门题
- POJ 3017 Cut the Sequence(dp+单调队列)
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
- Cut the Sequence,Sequence Partitioning,POJ3017,POJ3245,用单调队列优化的DP
- Cut the Sequence (单调队列优化DP)