HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

时间:2022-09-21 10:14:03

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 & 前缀和优化 & 四边形不等式优化的更多相关文章

  1. 区间DP石子合并问题 &amp&semi; 四边形不等式优化

    入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...

  2. 区间dp&plus;四边形不等式优化

    区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...

  3. &lbrack;51nod 1022&rsqb; 石子归并v2 &lbrack;dp&plus;四边形不等式优化&rsqb;

    题面: 传送门 思路: 加强版的石子归并,现在朴素的区间dp无法解决问题了 首先我们破环成链,复制一条一样的链并粘贴到原来的链后面,变成一个2n长度的序列,在它上面dp,效率O(8n^3) 显然是过不 ...

  4. hdu 2829 Lawrence&lpar;四边形不等式优化dp&rpar;

    T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...

  5. HDU 2829 Lawrence &lpar;斜率优化DP或四边形不等式优化DP&rpar;

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

  6. CSP 201612-4 压缩编码 【区间DP&plus;四边形不等式优化】

    问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...

  7. 二叉搜索树 &lbrack;四边形不等式优化区间dp&rsqb;

    二叉搜索树 [四边形不等式优化区间dp] 题目描述 有 \(n\) 个结点,第 \(i\) 个结点的权值为 \(i\) . 你需要对它们进行一些操作并维护一些信息,因此,你需要对它们建立一棵二叉搜索树 ...

  8. 区间dp之四边形不等式优化详解及证明

    看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...

  9. 区间DP的四边形不等式优化

    今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:

随机推荐

  1. python中的collections

    python中有大量的内置模块,很多是属于特定开发的功能性模块,但collections是属于对基础数据的类型的补充模块,因此,在日常代码中使用频率更高一些,值得做个笔记,本文只做主要关键字介绍,详细 ...

  2. Jmeter - 源码开发环境配置

    step1: 创建一个JavaProject , 我们命名为 JmeterSrcDev,点击Next.

  3. 图的邻接多重表和搜索(C&plus;&plus;版本)

    最近在学数据结构,学到图这一章,网上的C++版本的代码乱得不行,所以自己写了一个完整C++版本的放这里. 用邻接多重表表示一个无向图,并给出DFS和BFS搜索代码.邻接多重表好处就是贼直观,几条边就几 ...

  4. Arduino I2C &plus; 三轴加速度计LIS3DH

    LIS3DH是ST公司生产的MEMS三轴加速度计芯片,实现运动传感的功能.主要特性有: 宽工作电压范围:1.71 ~ 3.6V 功耗:低功耗模式2μA:正常工作模式.ODR = 50Hz时功耗11μA ...

  5. SQL &amp&semi; PL&sol;SQL 模块总结

    SQL 1. 各种function 2. merge 3. connect by PL/SQL 1. pl/sql 寄出 2. 游标 3. procedure 4. function 5. packa ...

  6. Mysql存储过程知识,案例--mysql存储过程基本函数

    Mysql存储过程知识,案例: create procedure delete_setting(in p_settingid integer) begin delete from setting wh ...

  7. 07ADO&period;Net

    1.ADO.Net简介 代码示例: using (MySqlConnection conn = new MySqlConnection("Server=localhost;Database= ...

  8. 在Spring aop中的propagation的7种配置的意思

    <tx:method name="find*" read-only="true" propagation ="NOT_SUPPORTED&quo ...

  9. KVM之五:KVM日常管理常用命令

    1.查看.编辑及备份KVM 虚拟机配置文件 以及查看KVM 状态: 1.1.KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下,默认是以虚拟机名称命名的.xml 文件,如下,: ...

  10. photoshop 笔记

    替换颜色 (图像)—(调整)—(替换颜色)—点下你想换掉的绿色----拖动下方的滑 块—(色相)拖到最大—(饱合度)调到最小----(明度)调到最大 OK 发现对你不想变色的图像稍微有点影响,但只是一 ...