题意:n个数之间放m个障碍,分隔成m+1段。对于每段两两数相乘再求和,然后把这m+1个值加起来,让这个值最小。

设:

d(i, j)表示前i个数之间放j个炸弹能得到的最小值

sum(i)为前缀和,cost(i)为前i个数两两相乘之和。

则有状态转移方程:

设0 ≤ l < k < i,且k比l更优,有不等式:

整理得到,注意不等号方向:

最后变成了斜率的形式,下面就用一个队列维护即可。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ; int n, m; int sum[maxn], cost[maxn];
int d[maxn][maxn]; int head, tail;
int Q[maxn]; int j; int inline Y(int i)
{
return d[i][j-] + sum[i] * sum[i] - cost[i];
} int inline DY(int x1, int x2) { return Y(x2) - Y(x1); } int inline DX(int x1, int x2) { return sum[x2] - sum[x1]; } int inline DP(int x1, int x2) { return d[x1][j-] + cost[x2] - cost[x1] - sum[x1]*(sum[x2]-sum[x1]); } int main()
{
while(scanf("%d%d", &n, &m) == && n)
{
for(int i = ; i <= n; i++) scanf("%d", sum + i);
for(int i = ; i <= n; i++) sum[i] += sum[i - ];
for(int i = ; i <= n; i++) cost[i] = cost[i-] + (sum[i]-sum[i-])*sum[i-]; for(int i = ; i <= n; i++) d[i][] = cost[i];
for(j = ; j <= m; j++)
{
head = tail = ;
Q[tail++] = ;
for(int i = ; i <= n; i++)
{
while(head + < tail && DY(Q[head], Q[head+]) <= sum[i] * DX(Q[head], Q[head+])) head++;
d[i][j] = DP(Q[head], i);
while(head + < tail && DY(Q[tail-], i) * DX(Q[tail-], Q[tail-]) <= DY(Q[tail-], Q[tail-]) * DX(Q[tail-], i)) tail--;
Q[tail++] = i;
}
} printf("%d\n", d[n][m]);
} return ;
}

代码君

贴一个四边形不等式优化的代码对比一下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
const int INF = 0x3f3f3f3f; int n, m;
int a[maxn], sum[maxn], cost[maxn];
int d[maxn][maxn], s[maxn][maxn]; int inline w(int k, int j)
{
return cost[j] - cost[k-] - sum[k-] * (sum[j] - sum[k-]);
} int main()
{
while(scanf("%d%d", &n, &m) == && n)
{
m++; for(int i = ; i <= n; i++) scanf("%d", a + i);
for(int i = ; i <= n; i++) sum[i] = sum[i - ] + a[i];
for(int i = ; i <= n; i++) cost[i] = cost[i-] + sum[i-] * a[i]; memset(d, , sizeof(d));
for(int i = ; i <= m; i++)
for(int j = i + ; j <= n; j++) d[i][j] = INF; for(int i = ; i <= n; i++) { d[][i] = cost[i]; s[][i] = ; }
for(int i = ; i <= m; i++)
{
s[i][n+] = n;
for(int j = n; j >= i; j--)
{
for(int k = s[i-][j]; k <= s[i][j+]; k++)
{
int tmp = d[i-][k] + w(k+, j);
if(tmp < d[i][j])
{ d[i][j] = tmp; s[i][j] = k; }
}
}
} printf("%d\n", d[m][n]);
} return ;
}

代码君

HDU 2829 斜率优化DP Lawrence的更多相关文章

  1. hdu 3669(斜率优化DP)

    Cross the Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others) ...

  2. HDU 4258 斜率优化dp

    Covered Walkway Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  3. hdu 3045 斜率优化DP

    思路:dp[i]=dp[j]+sum[i]-sum[j]-(i-j)*num[j+1]; 然后就是比较斜率. 注意的时这里j+t<=i: #include<iostream> #in ...

  4. Print Article HDU - 3507 -斜率优化DP

    思路 : 1,用一个单调队列来维护解集. 2,假设队列中从头到尾已经有元素a b c.那么当d要入队的时候,我们维护队列的下凸性质, 即如果g[d,c]<g[c,b],那么就将c点删除.直到找到 ...

  5. HDU 3507 斜率优化dp

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  6. HDU 3507斜率优化dp

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  7. HDU 3507 斜率优化 DP Print Article

    在kuangbin巨巨博客上学的. #include <iostream> #include <cstdio> #include <cstring> #includ ...

  8. hdu 2829 Lawrence(斜率优化DP)

    题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...

  9. HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

    题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...

随机推荐

  1. CentOS Linux 搭建 SVN(CollabNet Subversion)服务器

    安装CollabNet Subversion之前必须先安装JDK1.6和python2.4 ~ 2.6 groupadd svn useradd -g svn svnuser  passwd svnu ...

  2. 在b站做计网实验 - 抓包/get/post

    前言 这篇博文是一个小实验,用python发送get/post请求,其中用到cookie登录bilibili网站并修改个人信息. 抓包 对HTTP应用而言,用浏览器自带的插件可以很方便做到抓包,比如c ...

  3. 生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务

    mysql+keepalive实现浮动地址自动切换,由于keepalive无自带健康检查功能,所以必须自动编写健康检查守护进程(监控DB1和DB2数据库的监控状态,来保证浮动地址双机自动切换.) 一, ...

  4. 别让CDN的回源把你的服务器拖垮,采用正确的回源策略

    我们有一台服务器提供的服务主要是以动态页面为主,静态页面都是固定的内容平时更新的很少,最近这台服务器的应用升级到了新版本访问量增大了不少,随之的问题就来了,最近每天一到9点负载就超过警戒值,然后负载持 ...

  5. ps 进程管理

    一. 进程管理 1. pstree 2. ps 3. top 4. nice 5. free 6. screen 二. 程序与进程 程序是静态的文件,进程是动态运行的程序. 三. 进程和线程 一个程序 ...

  6. Eclipse优化工具Optimizer for Eclipse

    第一次看到是Optimizer for Eclipse是在InfoQ 然后使用了一下,发现不错啊,我的好几年的破本都能比较快的启动Eclipse了 好了,废话不说了,来介绍一下Optimizer fo ...

  7. Eclipse介绍

    Eclipse是著名的跨平台开源集成开发环境(IDE).最初主要用来Java语言开发.Eclipse的本身只是一个框架平台,通过插件使其作为C/C++.Python.PHP等其他语言的开发工具.Ecl ...

  8. Selenium私房菜系列7 -- 玩转Selenium Server

    本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的交互模式开始. 在<第一个Selenium RC测试案例>中,我们以命令“jav ...

  9. C# 一维数组 冒泡排序

    假设有个三个杯子    一个杯子中有一个紫色的乒乓球  一个没有  一个有红色乒乓球    杯子不能动 怎么把紫色和红色的调换呢 主要是先把紫色的放到空的杯子   在把红的放到紫色原来的杯子   再把 ...

  10. Mysql 主备配置

    来自:http://blog.csdn.net/u013256816/article/details/52536283 1. 了解主备配置过程原理. http://blog.csdn.net/u013 ...