这道题和06年论文《从一类单调性问题看算法的优化》第一道例题很相似。

题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量最小。

思路:O(n ^ 3)的DP解法是很容易想出来的。

dp[i][j] 表示第i个矿石点是j个heap的最小花费。

dp[i][j] = min(dp[i][j] , dp[k][j - 1] + sigma(sum[i] - sum[k])) 。

其中i , j , k 分别要一重循环,所以复杂度达到10 ^ 9。

这显然是TLE的,所以需要优化。

我们可以来看状态转移方程,dp[i][j] = dp[k][j - 1] +( sum1[i] - sum1[k] ) * a[i] - (sum2[i] - sum2[k]) .其中sum1是1到i的总重量,sum2表示1到i的总重量*距离。

这样,我们就可以进行斜率优化了。

所以这一维就降成O(1)了。那总的复杂度就是O(n ^ 2)。

#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 2505
#define FI first
#define SE second
#define ll long long
#define PI acos(-1.0)
#define inf 0x7ffffffffffffll
#define LL(x) ( x << 1 )
#define bug puts("here")
#define PII pair<int,int>
#define RR(x) ( x << 1 | 1 )
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )using namespace std;#define N 1111ll sum1[N] ;
ll sum2[N] ;
ll dp[N][N] ;
int qe[N] ;
ll a[N] , b[N] ;
int n , m ;
//分子
ll getU(int j , int k , int z){return dp[k][j - 1] + sum2[k] - (dp[z][j - 1] + sum2[z]) ;
}
//分母
ll getD(int k , int z){return sum1[k] - sum1[z] ;
}ll getDP(int i ,int j ,int k){return dp[k][j - 1] + (sum1[i] - sum1[k]) * a[i] - (sum2[i] - sum2[k]) ;
}int main() {while(cin >> n >> m){for (int i = 1 ; i <= n ; i ++ )cin >> a[i] >> b[i] ;sum1[0] = sum2[0] = 0 ;for (int i = 1 ; i <= n ; i ++ ){sum1[i] = sum1[i - 1] + b[i] ;sum2[i] = sum2[i - 1] + a[i] * b[i] ;
//            cout << sum1[i] << " " << sum2[i] << endl;}for (int i = 0 ; i <= n ; i ++ )for (int j = 0 ; j <= m ; j ++) dp[i][j] = inf ;dp[0][0] = 0 ;for (int j = 1 ; j <= m ; j ++ ){int head = 0 , tail = 0 ;qe[tail ++ ] = 0 ;for (int i = 1 ; i <= n ; i ++ ){while(head + 1 < tail && getU(j , qe[head + 1] , qe[head]) <= a[i] * getD(qe[head + 1] , qe[head]))head ++ ;dp[i][j] = getDP(i , j , qe[head]) ;while(head + 1 < tail && getU(j , i , qe[tail - 1]) * getD(qe[tail - 1] ,qe[tail - 2]) <=getU(j , qe[tail - 1] , qe[tail - 2]) * getD(i , qe[tail - 1]))tail -- ;qe[tail ++ ] = i ;}}cout << dp[n][m] << endl ;}return 0 ;
}

转载于:https://www.cnblogs.com/suncoolcat/p/3301700.html

UVAlive 6131 dp+斜率优化相关推荐

  1. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  2. BZOJ 3156: 防御准备( dp + 斜率优化 )

    dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...

  3. 【BZOJ-3156】防御准备 DP + 斜率优化

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 951  Solved: 446 [Submit][Status][Discus ...

  4. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  5. hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...

  6. C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )

    链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...

  7. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

  8. FZU - 2302  Necklace (dp+斜率优化)

    I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...

  9. CDOJ 879 摩天轮 dp+斜率优化

    原题链接:http://www.acm.uestc.edu.cn/#/problem/show/879 题意: 中文题 题解: 这是一道斜率dp的题. 先把$a$数组排个序. 令$dp[i][j]$表 ...

最新文章

  1. Java笔记01-数组相关
  2. java8源代码_java8 源码解读
  3. 电子工程可以报考二建_二建报考要求是工程类专业怎么办?非工程类专业可以报名吗?...
  4. PHP GD压缩图片
  5. underscorejs之_.filter(list, predicate, [context])
  6. mysql中的join问题:mysql不支持full join
  7. 用户使用双屏扩展桌面类软件时,所遇到的主要疑难问题汇编
  8. 阮一峰es6,Proxy和Reflect学习
  9. 新商机:“百亿帝国”全健、华林彻底倒下,保健行业遭重创,直销业被重新定义
  10. 使用Apache Ignite瘦客户端– Apache Ignite内部博客
  11. 立创EDA学习笔记(5)——PCB设计
  12. OSPF网络类型以及不规则区域练习
  13. Linux操作系统学习笔记【入门必备】
  14. Linux系统查看发行版本
  15. 开发小程序需要服务器吗?小程序服务器配置要求
  16. 【计算机网络】 如何看懂路由表
  17. 机器学习-白板推导系列(一)-绪论(机器学习的MLE(最大似然估计)和MAP(最大后验估计))
  18. 分享30个PHP源码,总有一款适合你
  19. 什么是真正的 HTAP ?(二)挑战篇
  20. 数据库表设置外键VS不设置外键,哪个更好?

热门文章

  1. 【OpenGL从入门到精通(二)】绘制一个点
  2. kettle 内存设置_【转】kettle 的内存设置及输出日志的时间类型
  3. PHP怎么检查登录和退出,如何检查用户是否以PHP登录?
  4. 【渝粤题库】陕西师范大学209013 计量经济学 作业
  5. int型 判断奇偶_XSS(Reflected) 反射型跨站攻击
  6. 5G的场景、需求、通信速率
  7. Linux程序设计实验项目六,《linux程序设计》实验教学大纲
  8. android 通知垃圾回收,Android中垃圾回收日志信息
  9. QPSK信号调制之ASCII码
  10. 传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal