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. c语言学习第四天数据类型1

    int   代表整数,它在内存中占4个字节,二进制的表示方式是占用了三十二位,二进制中只包含0和1,那它的最大值就是全为1,但int是 有符号类型,所以最高位(左边的第一位)要拿出来做符号位,这样就只 ...

  2. mariadb一些命令介绍及mariadb架构图和索引

    mariadb> SHOW GLOBAL VARIABLES; 全局变量影响服务器的全局操作 mariadb> SHOW [SESSION] VARIABLES; 客户端变量,只对当前会话 ...

  3. php设计模式之单例、多例设计模式

    单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...

  4. 从零开始之ecshop基础篇(17)

    目标:基于自定义的mvc框架开发的案例(项目) 项目周期    需求分析 典型的业务逻辑:    电子商务:商城(京东),B2C,C2C(淘宝),团购,秒杀,代购 内容管理:新浪门户类,优酷视频管理, ...

  5. [CentOS 7] 安装nginx第一步先搭建nginx服务器环境

    简要地介绍一下,如何在CentOS 7中安装nginx服务器 方法/步骤   下载对应当前系统版本的nginx包(package) # wget  http://nginx.org/packages/ ...

  6. SQLite中命令行程序(CLP)的使用

    SQLite CLP是使用和管理SQLite数据库最常用的工具.它在所有平台上的操作方式相同.CLP其实是两个程序,它可以运行在Shell模式下以交互的方式执行查询操作,也可以运行在命令行模式下完成各 ...

  7. pandas聚合和分组运算——GroupBy技术(1)

    数据聚合与分组运算——GroupBy技术(1),有需要的朋友可以参考下. pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片.切块.摘要等操作.根据一个或多个 ...

  8. 使用RMAN验证备份的有效性

    --验证控制文件和参数文件: RMAN> restore validate controlfile; Starting allocated channel: ORA_DISK_1 channel ...

  9. m3u8

    audo apt-get install pkg-configsudo apt-get install automake autoconf m4 libtool sudo apt-get instal ...

  10. 自学Python二 Python中的屠龙刀(续)

    函数 秉承着一切皆对象的理念,函数作为对象,可以为其赋值新的对象名,也可以作为参数传递给其他函数! 正常的诸如空函数,默认参数等等我们就不提了,在这里着重提一下默认参数里面的坑和lambda函数. 当 ...