好方啊马上就要区域赛了连DP都不会QAQ

毛子青《动态规划算法的优化技巧》论文里面提到了一类问题:石子合并。

n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

求出将n堆石子合并成一堆的最小得分和最大得分以及相应的合并方案。

设m[i,j]表示合并d[i..j]所得到的最小得分。

状态转移方程:

总的时间复杂度为O(n3)。

【优化方案】

四边形不等式:

m[i,j]满足四边形不等式

令s[i,j]=max{k | m[i,j]=m[i,k-1]+m[k,j]+w[i,j] }

m[i,j]满足四边形不等式可以推出函数s[i,j]的单调性,即s[i,j]≤s[i,j+1]≤s[i+1,j+1],     i≤j

优化的状态转移方程:

状态转移方程 m[i][j]=min{m[i][k-1]+m[k][j]}+w[i][j]}  (i<=k<=j)

如果w同时满足四边形不等式和区间单调关系,则m也满足四边形不等式

四边形不等式优化的作用:m满足四边形不等式 -> k最优决策单调性

参考博客:http://blog.csdn.net/bnmjmz/article/details/41308919

  #include <string.h>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#define LL long long
#define MOD 1000000007 using namespace std; const int INF = 0x3f3f3f;
const int N = ; int m[N][N]; //m[i,j]表示合并d[i..j]所得到的最小得分
int s[N][N]; //s[i,j]记录合并方案
int sum[N]; //前i个石子堆石子数量和
int n; int solve()
{
for(int i=; i<=n; i++)
{
m[i][i] = ; //边界条件
s[i][i] = i;
}
for(int l=; l<n; l++) //枚举 l = j' - i
{
for(int i=; i+l<=n; i++)
{
int j = i+l;
int tmp = INF;
int k = ;
for(int div=s[i][j-]; div<=s[i+][j];div++) //最优决策的单调性
{
if(tmp > m[i][div] + m[div+][j] + sum[j] - sum[i-] )
{
tmp = m[i][div] + m[div+][j] + sum[j] - sum[i-];
k = div;
}
}
m[i][j] = tmp;
s[i][j] = k;
}
}
return m[][n];
} int main()
{
while(scanf("%d",&n)!=EOF)
{
sum[] = ;
for(int i=; i<=n; i++)
{
int a;
scanf("%d",&a);
sum[i] = sum[i-] + a;
}
printf("%d\n",solve());
}
return ;
}

四边形不等式优化DP——石子合并问题 学习笔记的更多相关文章

  1. 四边形不等式优化_石子合并问题_C++

    在动态规划中,经常遇到形如下式的状态转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某 ...

  2. <四边形不等式优化>[NOI1995]石子合并

    留个坑 挺套路的 明天来写个总结 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = ...

  3. codevs3002石子归并3(四边形不等式优化dp)

    3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm  时间限制: 1 s  空间限制: 256000 KB  题目等级 ...

  4. hdu 2829 Lawrence(四边形不等式优化dp)

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

  5. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  6. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  7. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

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

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

  9. POJ 1160 四边形不等式优化DP Post Office

    d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...

随机推荐

  1. 【java】在controller层使用的检查单一字段不能为null和检查属性中某些字段不能为null的工具

    ========================================================================================= 代码参考地址:Git ...

  2. Thread.Join(int millisecondsTimeout)

    Join 就是加入的意思,也就是说新创建的线程加入到进程中,并马上执行. 看下面这段代码 Console.WriteLine("start"); Thread myTask = n ...

  3. 理解 VMWare的3种网络模型 z

    在说到VMware的网络模型之前,先说一下VMware的几个虚拟设备: ■ VMnet0:这是VMware用于虚拟桥接网络下的虚拟交换机: ■ VMnet1:这是VMware用于虚拟Host-Only ...

  4. Assembly.Load动态加载程序集而不占用文件 z

    方式一:占用文件的加载 Assembly assembly = Assembly.Load(path); 用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的d ...

  5. apache的proxy代理总访问后端web的第一个虚拟主机

    先查看cat /usr/local/apache2/modules 时候有mod_proxy.so  mod_proxy_http.so mod_proxy_connect 如果没有,使用apache ...

  6. 设置textField的placegolder的字体大小和字体颜色

           由于项目的主题颜色为灰黑色,所以当使用textField的时候,placeholder内的字体默认是灰色,当程序执行的时候,差点儿看不到.        翻来翻去找到一种比較简单地方法, ...

  7. Apache Beam WordCount编程实战及源代码解读

    概述:Apache Beam WordCount编程实战及源代码解读,并通过intellij IDEA和terminal两种方式调试执行WordCount程序,Apache Beam对大数据的批处理和 ...

  8. 2017.9.15 mybatis批量插入后实现主键回填

    参考来自:mybatis mysql 批量insert 返回主键 注意:必须要在mybatis3.3.1及其以上才能实现. 1.service List branchEntryList = (Arra ...

  9. 资深程序员教你如何实现API自动化测试平台!附项目源码!

    原文链接: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够, 2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他们并行开发. 3.同时让自 ...

  10. C4:原型模式 Prototype

    用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.应用场景: A.用new创建对象通常有较为复杂的数据准备或权限准备B.对象较大,拷贝对象可以节省内存 UML图: class WorkExp ...