【HDOJ】【2829】Lawrence
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
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.
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.
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.
4 5 1 2
4 2
4 5 1 2
0 0
2
【HDOJ】【2829】Lawrence的更多相关文章
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147
以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...
- 【HDOJ 5379】 Mahjong tree
[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...
- HDOJ 1238 Substrings 【最长公共子串】
HDOJ 1238 Substrings [最长公共子串] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 【HDOJ 2089】不要62
[HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...
- 【HDOJ 5371】 Hotaru's problem
[HDOJ 5371] Hotaru's problem Manacher算法+穷举/set Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/de ...
- 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...
- 【HDOJ 5399】Too Simple
pid=5399">[HDOJ 5399]Too Simple 函数映射问题 给出m函数 里面有0~m个函数未知(-1) 问要求最后1~n分别相应仍映射1~n 有几种函数写法(已给定的 ...
随机推荐
- jquery之val()和attr("value")
1.attr("value")=原来的默认值 ,而val()=用户改变的值.
- PHP session回收机制
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...
- Delphi开发的IP地址修改工具
用Delphi进行开发的,直接修改注册表,需重启电脑后才生效
- sqlalchemy - day4
query 此文算是自己的一个总结,不敢说对sqlalchemy有多精通,只能算是入门的总结,免得后面忘记了这些个基本的东西.数据库的增,删,改,查,前面已经介绍了session的增,删,改,现在来介 ...
- r
http://vgoulet.act.ulaval.ca/en/emacs/mac/ mean() 均值 sd()标准差 http://www.walware.de/it/downloads/stat ...
- ThinkPHP 3.2.2跨控制器调用方法
所谓跨控制器调用,指的是在一个控制器中调用另一个控制器的某个方法.在ThinkPHP中有三种方式实现跨控制器调用: 直接实例化: A()函数实例化; R()函数实例化. (1)直接实例化 直接实例 ...
- DeviceOne开发HelloWord
http://www.cnblogs.com/wjiaonianhua/p/5278061.html http://www.jb51.net/article/75693.htm 2015 年 9 月 ...
- golang反射初试
golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST. t := reflect.TypeOf(obj) 使用TypeOf( ...
- IOS 其他 - 如何让 app 支持32位和64位
让App支持32-bit和64-bit基本步骤 1.确保Xcode版本号>=5.0.1 2.更新project settings, minimum deployment target >= ...
- CentOs环境下PHP支持PDO_MYSQL
一.下载相应tgz包: http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz二.安装开始 解压# tar zxvf PDO_MYSQL-1.0.2.tgz # cd ...