DP/四边形不等式


  做过POJ 1739 邮局那道题后就很容易写出动规方程:

    dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价)

  $w(l,r)=\sum_{i=l}^{r}\sum_{j=i+1}^{r}a[i]*a[j]$

  那么就有 $w(l,r+1)=w(l,r)+a[j]*\sum\limits_{i=l}^{r}a[i]$

  所以:w[i][j]明显满足 关于区间包含的单调性

  然后我们大胆猜想,小(bu)心(yong)证明,w[i][j]满足四边形不等式,所以这题就跟邮局那题一样了……

  咳咳好吧作为一个有节操的人,我还是尝试着证明了一下(结果发现用来证明的时间比我写代码的时间要长……)

  先把w(i,j)的定义搬下来:\[ w(l,r)=\sum\limits_{i=l}^{r}\sum\limits_{j=i+1}^{r}a[i]*a[j] \]

  形象一点来说就是:

    对于$ i\leq i' < j \leq j' $

    中间的都是要算两次,剩下的部分:

      (左)表示w(i,i'-1),[左]表示 $\sum_{k=i}^{i'-1}a[k] $

      (中)表示w(i',j),[中]表示 $\sum_{k=i'}^j a[k] $

      (右)表示w(j+1,j'),[右]表示 $\sum_{k=j+1}^{j'} a[k] $

    \[ w(i,j)+w(i',j')=(左)+[左]*[中]+(右)+[右]*[中]+(中) \\ w(i,j')+w(i',j)=(左+右)+[左+右]*[中]+(中)  \]

    

    其中\[ [左+右]*[中]=[左]*[中]+[右]*[中]  \]

    但\[ (左+右)=(左)+(右)+[左]*[右] \]

    所以\[ (左+右)>(左)+(右) \]

    所以\[w(i,j)+w(i',j') \leq w(i,j')+w(i',j) \]  

 //HDOJ 2829
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
const double eps=1e-;
#define debug
/*******************template********************/
int dp[N][N],s[N][N],w[N][N],b[N],a[N],n,m; int main(){
while(scanf("%d%d",&n,&m)!=EOF && n){
m++;
F(i,,n) a[i]=getint();
F(i,,n){
b[i]=a[i];
w[i][i]=;
F(j,i+,n){
w[i][j]=w[i][j-]+a[j]*b[i];
b[i]+=a[j];
}
}
F(i,,n) F(j,,m) dp[j][i]=INF;
F(i,,n){
dp[][i]=w[][i];
s[][i]=;
}
F(i,,m){
s[i][n+]=n;
D(j,n,i)
F(k,s[i-][j],s[i][j+])
if(dp[i-][k]+w[k+][j]<dp[i][j]){
s[i][j]=k;
dp[i][j]=dp[i-][k]+w[k+][j];
}
}
printf("%d\n",dp[m][n]);
}
return ;
}

Lawrence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2448    Accepted Submission(s): 1093

Problem Description
T.
E. Lawrence was a controversial figure during World War I. He was a
British officer who served in the Arabian theater and led a group of
Arab nationals in guerilla strikes against the Ottoman Empire. His
primary targets were the railroads. A highly fictionalized version of
his exploits was presented in the blockbuster movie, "Lawrence of
Arabia".

You are to write a program to help Lawrence figure out
how to best use his limited resources. You have some information from
British Intelligence. First, the rail line is completely linear---there
are no branches, no spurs. Next, British Intelligence has assigned a
Strategic Importance to each depot---an integer from 1 to 100. A depot
is of no use on its own, it only has value if it is connected to other
depots. The Strategic Value of the entire railroad is calculated by
adding up the products of the Strategic Values for every pair of depots
that are connected, directly or indirectly, by the rail line. Consider
this railroad:

Its Strategic Value is 4*5 + 4*1 + 4*2 + 5*1 + 5*2 + 1*2 = 49.

Now,
suppose that Lawrence only has enough resources for one attack. He
cannot attack the depots themselves---they are too well defended. He
must attack the rail line between depots, in the middle of the desert.
Consider what would happen if Lawrence attacked this rail line right in
the middle:

The Strategic Value of the remaining railroad is 4*5 + 1*2 = 22. But, suppose Lawrence attacks between the 4 and 5 depots:

The Strategic Value of the remaining railroad is 5*1 + 5*2 + 1*2 = 17. This is Lawrence's best option.

Given
a description of a railroad and the number of attacks that Lawrence can
perform, figure out the smallest Strategic Value that he can achieve
for that railroad.

 
Input
There
will be several data sets. Each data set will begin with a line with
two integers, n and m. n is the number of depots on the railroad
(1≤n≤1000), and m is the number of attacks Lawrence has resources for
(0≤m<n). On the next line will be n integers, each from 1 to 100,
indicating the Strategic Value of each depot in order. End of input will
be marked by a line with n=0 and m=0, which should not be processed.
 
Output
For
each data set, output a single integer, indicating the smallest
Strategic Value for the railroad that Lawrence can achieve with his
attacks. Output each integer in its own line.
 
Sample Input
4 1
4 5 1 2
4 2
4 5 1 2
0 0
 
Sample Output
17
2
 
Source

【HDOJ】【2829】Lawrence的更多相关文章

  1. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  2. 【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147

    以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...

  3. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  4. HDOJ 1238 Substrings 【最长公共子串】

    HDOJ 1238 Substrings [最长公共子串] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  5. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  6. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  7. 【HDOJ 2089】不要62

    [HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...

  8. 【HDOJ 5371】 Hotaru&#39;s problem

    [HDOJ 5371] Hotaru's problem Manacher算法+穷举/set Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/de ...

  9. 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)

    pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...

  10. 【HDOJ 5399】Too Simple

    pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...

随机推荐

  1. ASP.NET中application对象

    ASP.NET中application对象的使用. Application对象的应用  1.使用Application对象保存信息  (1).使用Application对象保存信息  Applicat ...

  2. Windows7不能打开telnet功能

    在dos窗口中输入telnet命令提示如下: 解决方法是打开控制面板中的程序和功能,选择打开或关闭Window是功能,如下: 勾选上面的Telnet客户端,然后确定,出现下图.稍等片刻重新打开命令行, ...

  3. php框架学习的步骤

    一,选择一个合适的php框架 在国内,使用zf,ci和tp框架的人比较多,新手可以从中选一个去学习,新手不建议一开始就去学习zf,功力还不够深,学习zf会让你更迷茫. 二,选定一个php框架之后,如何 ...

  4. 第十八章 数据访问(In .net4.5) 之 I/O操作

    1. 概述 本章内容包括 文件操作.流操作.读写网络数据 以及 异步I/O操作. 2. 主要内容 2.1 文件操作 ① 使用 Drive 和 DriveInfo 访问磁盘信息. DriveInfo[] ...

  5. 【笔记】WPF实现ViewPager引导界面效果及问题汇总

    最近在开发项目的首次使用引导界面时,遇到了问题,引导界面类似于安卓手机ViewPager那样的效果,希望通过左右滑动手指来实现切换不同页面,其间伴随动画. 实现思路: 1.界面布局:新建一个UserC ...

  6. SQL基础篇---函数及其函数配套使用的关键字

    一.数值函数 知识点1 SUM 求总和 SELECT breakfast,sum(price) FROM my_foods GROUP BY breakfast ORDER BY SUM(price) ...

  7. 禁止生成文件Thumbs.db

    Thumbs.db是一个用于Microsoft Windows XP.Windows7 或 mac os x缓存Windows Explorer的缩略图的文件.Thumbs.db保存在每一个包含图片或 ...

  8. [译]rabbitmq 2.5 Where’s my message? Durability and you

    我对rabbitmq学习还不深入,这些翻译仅仅做资料保存,希望不要误导大家. There’s a dirty secret about creating queues and exchanges in ...

  9. IOS内存管理「2」- 点语法的内存管理

  10. ASP.NET MVC中使用事务写法

    一些项目中,会涉及到事务的写法,比如订单相关,订单成功,会涉及到产品的库存和账户金额的一些信息变动,当然,如果整个流程成功,那是没什么问题,关键是如果中间某一步骤出现bug了,那之前已执行的一些变动就 ...