【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 有几种函数写法(已给定的 ...
随机推荐
- 删除map容器中指定的元素
for (std::map<Int64,Int64>::iterator iter = ips_forbidden_.begin(); iter != ips_forbidden_.end ...
- PHP+ajax聊天室源码!支持长轮循跟定时请求两种
var lastID = "1";//声明上次取回的消息的ID var isposted = false; var mGetTime;//设置setTimeout的返回值 // ...
- 第四章 管理程序流(In .net4.5) 之 事件和回调
1. 概述 本章讲解如何使用 委托.lambda表达式 和 匿名方法 来创建和使用事件. 2. 主要内容 2.1 理解委托 委托是一种用方法签名形式定义的类型.可以让它指向其他方法,可以通过它调用其他 ...
- DB2查询结果显示n行
在SQLserver中语法是这样的:select top n * from staff ,即可查询显示n行数据 但是在DB2中语法是这样的,感觉比较接近英语. select * from STAFF ...
- oracle 修改表空间存储路径
[root@yoon ~]# more /etc/oracle-releaseOracle Linux Server release 5.7 Oracle Database 11g Enterpris ...
- hdu 5444 Elven Postman
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Description Elves are very peculia ...
- poj 3580 SuperMemo
题目连接 http://poj.org/problem?id=3580 SuperMemo Description Your friend, Jackson is invited to a TV sh ...
- hdu 1908 Double Queue
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1908 Double Queue Description The new founded Balkan ...
- core java 10~12(多线程 & I/O & Network网络编程)
MODULE 10 Threads 多线程-------------------------------- 进程: 计算机在运行过程中的任务单元,CPU在一个时间点上只能执行一个进程,但在一个时间段上 ...
- Swift 中使用Nimble 库进行单元测试
Nimble 从字面上看是 敏捷,灵活 的意思.Nimble 是一个库,一个 断言库.这个库一般用于单元测试.Xcode 6 为我们集成了 XCTest 单元测试库.在正式介绍 Nimble 之前,我 ...