HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的区间DP问题 d
p[i][j]表示前i个节点,分为j个区间的最优策略值 cost[i][j]为从i到j节点的策略值 所以dp[i][j] = min(dp[k-1][j-1] + cost[k][i]
但是复杂度太高了 可以优化的地方有: cost数组值得求取: 考虑到cost(i,j)=ΣAxAy (i≤x<y≤j) 而(Ai+...+Aj)^2=ΣAxAy (i≤x,y≤j) 于是可以得到: cost(i,j)=((Ai+...+Aj)^2-(Ai^2+...+Aj^2))/2 这是一个优化后线性n的等式 式子中的若干连续项的和与若干连续项的平方和 是可以用 前缀和 预先处理的, 所以设sum(i)=A1+...+Ai,sqsum(i)=A1^2+...+Ai^2, 将原式化为: cost(i,j)=((sum(j)-sum(i-1))^2-(sqsum(j)-sqsum(i-1)))/2
又因为是经典的区间DP问题所以可以用四边形不等式进行优化
设s[i][j]为dp[i][j]的前导状态dp[i][j] = dp[s[i][j][j-1] + cost[s[i][j]+1][j]之后我们枚举k的时候只要枚举s[i][j-1]<=k<=s[i+1][j],此时j必须从小到大遍历i必须从大到小。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#define inf (1 << 30)
using namespace std;
const int maxn = 1e3 + 1e2;
int dp[maxn][maxn];
int s[maxn][maxn];
//设s[i][j]为dp[i][j]的前导状态
//dp[i][j] = dp[s[i][j][j-1] + cost[s[i][j]+1][j]
//之后我们枚举k的时候只要枚举
//s[i][j-1]<=k<=s[i+1][j],此时j必须从小到大遍历
//i必须从大到小。
int cost[maxn][maxn];
int sum[maxn],powsum[maxn];
int a[maxn];
/*int get_cost(int l,int r)
{
if(r < l)return 0;
return ((sum[r] - sum[l-1]) * (sum[r] - sum[l-1]) - (powsum[r] - powsum[l-1])) / 2;
}*/
void init()
{
memset(sum,0,sizeof(sum));
memset(powsum,0,sizeof(powsum));
memset(cost,0,sizeof(cost));
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{ if(n == m && n == 0)break;
init();
//m++;
//前缀和处理
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
sum[i] = sum[i-1] + a[i];
powsum[i] = powsum[i-1] + a[i] * a[i];
} /*for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
{
if(j < i) cost[i][j] = 0;
else cost[i][j] = cost[i][j-1] + a[j] * (sum[j-1] - sum[i-1]);
}*/
//特殊值预处理
//这里没有m++但是0代表分一块
for(int i = 0;i <= n;i++)
{
dp[i][0] = cost[1][i];
// dp[i][0] = get_cost(1,i);
s[i][0] = 0;
s[n+1][i] = n;//外面的界限出界后的特殊处理
}
//区间DP & 四边形不等式
for(int j = 1;j <= m;j++)//分几部分
{
for(int i = n;i >= 1;i--)//前n个节点
{
dp[i][j] = inf;
for(int k = s[i][j-1];k <= s[i+1][j];k++)
{
if(dp[i][j] > dp[k][j-1] + get_cost(k+1,i))
{
dp[i][j] = dp[k][j-1] + get_cost(k+1,i);
s[i][j] = k;//确定上一个状态
}
}
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化的更多相关文章
- 区间DP石子合并问题 & 四边形不等式优化
入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...
- 区间dp+四边形不等式优化
区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...
- [51nod 1022] 石子归并v2 [dp+四边形不等式优化]
题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...
- hdu 2829 Lawrence(四边形不等式优化dp)
T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...
- 二叉搜索树 [四边形不等式优化区间dp]
二叉搜索树 [四边形不等式优化区间dp] 题目描述 有 \(n\) 个结点,第 \(i\) 个结点的权值为 \(i\) . 你需要对它们进行一些操作并维护一些信息,因此,你需要对它们建立一棵二叉搜索树 ...
- 区间dp之四边形不等式优化详解及证明
看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...
- 区间DP的四边形不等式优化
今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:
随机推荐
- javascript 高级程序设计 十一
接上一节的创建对象的模式: 原型模式: 对于prototype的理解:我们创建的函数都有一个prototype(原型)属性,这个属性是一个指针指向一个对象,而这个对象的用途是包含基于这个方法的 所有的 ...
- How to use bmw icom a2
Lan Connect Operation Details 1. Connect the LAN cable to ICOM A1/ICOM A2, another side to laptop LA ...
- pycharm 创建文件时,自动添加文件头注释
File->settings->Editor->File and Code Templates->Python Script # -*- coding: utf-8 -*- & ...
- Lazarus下面的javascript绑定另外一个版本bug修正
Lazarus下面的javascript绑定另外一个版本bug修正 从svn 检出的代码有几个问题 1.fpcjs.pas 单元开始有 {$IFDEF FPC} {$MODE delphi} {$EN ...
- 网卡驱动如何设置组播MAC地址
参考资料: https://blog.csdn.net/abccheng/article/details/50465268 将网卡加入到组播组中.
- c sharp multithreading
1. 静态方法 using System; using System.Threading; namespace PlusThread { class Program { static void Ma ...
- Internet
0x01 URL的解析/反解析/连接 解析 urlparse()--分解URL # -*- coding: UTF-8 -*- from urlparse import urlparse url = ...
- rapidjson 的封装学习
#pragma once #include "Util.h" #include "rapidjson/writer.h" #include "rapi ...
- Java开发环境安装配置
电脑配置:Win7 64位 JDK1.8+Apache Tomcat8.5.4 下载JDK1.8 全名: Java SE Development Kit 8u151,下载最新稳定版本 下载地址:htt ...
- web.xml 详细介绍(zz)
web.xml 详细介绍 博客分类: CoreJava WebXMLServletJSPTomcat http://mianhuaman.iteye.com/blog/1105522 1.启动一个W ...