题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829

题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草补给的公式是将每个站能收到的粮草的总和。

4----5-----1-----2

粮草总和为4*5 + 4*1 + 4*2 + 5*1 + 5*2 + 1*2 = 49.

4----5       1-----2

粮草总和为4*5 + 1*2 = 22.

4      5-----1------2

粮草总和为5*1 + 5*2 + 1*2 = 17.

解题思路:参考,状态转移方程为dp[i][j]=min{dp[k][j-1]+cost[k+1][i]}(k<i),若cost[i][j]满足凸四边形不等式,则可以用四边形优化。

     这里我们有一个定理:cost为凸当且仅当 cost[i][j] + cost[i+1][j+1] <= cost[i+1][j] + cost[i][j+1]。

     我们可以把原式cost[i][j] + cost[i'][j'] <= cost[i][j'] + cost[i'][j]变为cost[i + 1][j + 1] - cost[i + 1][j] <= cost[i][j + 1] - cost[i][j],然后固定j变化i,看coat[i][j+1] - cost[i][j]是关于i递增还是递减,如果是递减,则cost为凸。

     一般如果不能直接看出来,可以进行打表。此题cost[i][j]满足该定理,于是可以用四边形优化将复杂度降至O(n^2)。

     注意:这里的是s[i][j]处理跟石子归并时不一样,还有i是倒着来的,不是正着的。

代码:

 #include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1e3+;
const long long INF=0x3f3f3f3f;
LL sum[N],dp[N][N],cost[N][N],s[N][N];//s[i][j]记录dp[i][j]的最优切割点 int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
if(n==&&m==)
break;
memset(cost,,sizeof(cost));
memset(dp,INF,sizeof(dp));
for(int i=;i<=n;i++){
scanf("%lld",&sum[i]);
sum[i]+=sum[i-];
s[i][]=;
}
//计算cost[i][j]
for(int i=;i<=n;i++){
for(int j=;j<i;j++){
cost[][i]+=(sum[j]-sum[j-])*(sum[i]-sum[j]);
}
dp[i][]=cost[][i];
}
for(int k=;k<=n;k++){
for(int i=k+;i<=n;i++){
cost[k][i]=cost[][i]-cost[][k-]-sum[k-]*(sum[i]-sum[k-]);
}
} //j为轰炸次数,当i = 1或者j = n时为边界对s的处理就是为了处理这些边界
for(int j=;j<=m;j++){
s[n+][j]=n-;
for(int i=n;i>=j;i--){
for(int k=s[i][j-];k<=s[i+][j];k++){
LL tmp=dp[k][j-]+cost[k+][i];
if(tmp<dp[i][j]){
dp[i][j]=tmp;
s[i][j]=k;
}
}
}
}
printf("%lld\n",dp[n][m]);
}
return ;
}

最新文章

  1. (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
  2. [BZOJ3262]陌上花开
  3. android wifi驱动移植详细过程
  4. Unity3D ShaderLab 简单的立方体图反射
  5. android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid
  6. Dagger学习笔记
  7. java 每天一练(二)
  8. 获取git的当前分支名称
  9. StretchDIBits使用方法
  10. ImageMagick 转换 progressive jpeg
  11. javaee加密部署,tomcat使用自己的classloader解密【正解】
  12. url语法
  13. (文件)图片上传,Spring或SpringMVC框架
  14. 提取多层嵌套Json数据
  15. php操作mongodb的常用函数
  16. Python Generator 运行细节验证
  17. 关于PHP 缓冲区: ob_star , ob_get_contents
  18. 解决微信小程序登录与发布的一些问题
  19. sql 索引笔记2
  20. HDU ACM 1869 六度分离(Floyd)

热门文章

  1. BZOJ1500:[NOI2005]维修数列——题解
  2. BZOJ2337:[HNOI2011]XOR和路径——题解
  3. BZOJ3932:[CQOI2015]任务查询系统——题解
  4. BZOJ1179 [Apio2009]Atm 【tarjan缩点】
  5. props设置state误区
  6. django error: DisallowedHost: Invalid HTTP_HOST header: &#39;&#39;. You may need to add u&#39;&#39; to ALLOWED_HOST
  7. [codeforces/edu31]总结
  8. TCP的连接(三次握手)和释放(四次挥手)
  9. expect使用小结
  10. Eclipse debug模式下使用16进制(Hex)查看变量值