题意:N个人排成一行,分成K组,要求每组的不和谐值之和最小。

思路:开始以为是斜率优化DP,但是每个区间的值其实已经知道了,即是没有和下标有关的未知数了,所以没必要用斜率。 四边形优化。

dp[i][j]表示前j个人分为i组的最小代价。 622ms

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int sum[maxn][maxn],cost[maxn][maxn],dp[][maxn],pos[][maxn];
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
int main()
{
int N,K,x,y;
scanf("%d%d",&N,&K);
rep(i,,K) rep(j,,N) dp[i][j]=;
rep(i,,N) rep(j,,N){
read(sum[i][j]);
sum[i][j]=sum[i][j]+sum[i][j-]+sum[i-][j]-sum[i-][j-];
}
rep(i,,N) rep(j,i+,N) cost[i][j]=(sum[j][j]+sum[i-][i-]-sum[j][i-]-sum[i-][j])/;
rep(i,,N) dp[][i]=cost[][i];
rep(i,,K){
for(int j=N;j>=i;j--){
int L=pos[i-][j]?pos[i-][j]:;
int R=pos[i][j+]?pos[i][j+]:N;
rep(k,L,R){
if(dp[i-][k]+cost[k+][j]<dp[i][j]){
dp[i][j]=dp[i-][k]+cost[k+][j];
pos[i][j]=k;
}
}
}
}
printf("%d\n",dp[K][N]);
return ;
}

利用DP决策单调性解决:684ms。二者时间差不多。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=0x3f3f3f3f;
int sum[maxn][maxn],cost[maxn][maxn],dp[maxn],ans[maxn];
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
void get(int l,int r,int L,int R){
if(l>r) return ;
int mid=(l+r)>>,MID;
rep(i,L+,min(R+,mid)){
if(ans[mid]>dp[i-]+cost[i][mid]){
ans[mid]=dp[i-]+cost[i][mid]; MID=i-;
}
}
get(l,mid-,L,MID); get(mid+,r,MID,R);
}
int main()
{
int N,K,x,y;
scanf("%d%d",&N,&K);
rep(i,,N) rep(j,,N){
read(sum[i][j]);
sum[i][j]=sum[i][j]+sum[i][j-]+sum[i-][j]-sum[i-][j-];
}
rep(i,,N) rep(j,i+,N) cost[i][j]=(sum[j][j]+sum[i-][i-]-sum[j][i-]-sum[i-][j])/;
rep(i,,N) ans[i]=cost[][i];
rep(i,,K){
rep(j,,N) dp[j]=ans[j],ans[j]=inf;
get(,N,,N-);
}
printf("%d\n",ans[N]);
return ;
}

CodeForces - 321E:Ciel and Gondolas (四边形不等式优化DP)的更多相关文章

  1. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  2. hdu 2829 Lawrence(四边形不等式优化dp)

    T. E. Lawrence was a controversial figure during World War I. He was a British officer who served in ...

  3. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  4. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  5. codevs3002石子归并3(四边形不等式优化dp)

    3002 石子归并 3 参考 http://it.dgzx.net/drkt/oszt/zltk/yxlw/dongtai3.htm  时间限制: 1 s  空间限制: 256000 KB  题目等级 ...

  6. HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)

    题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...

  7. 四边形不等式优化DP——石子合并问题 学习笔记

    好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...

  8. POJ 1160 四边形不等式优化DP Post Office

    d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...

  9. BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

随机推荐

  1. win7打开ftp步骤

    FTP是很方便文件传输的功能 打开ftp xftp连接 传输测试 如果连接不通的话,有可能是防火墙的问题

  2. 《Django By Example》

    <Django By Example>第六章 中文 翻译 (个人学习,渣翻) 书籍出处:https://www.packtpub.com/web-development/django-ex ...

  3. vue下个兄弟节点

    checkOne(e) { e.currentTarget.nextElementSibling.style.background = 'red' }

  4. bootstrap自定义——栅格列数修改

    从下载的bootstrap文件中找到less文件夹里面的variables.less,然后可以找到栅格列数进行修改 然后执行一下bootstrap.less,通过命令行,切换到其所在的目录D:\03 ...

  5. mvn deploy返回400错误的几种可能

    user credentials are wrong url to server is wrong user does not have access to the deployment reposi ...

  6. 基于事件的 JavaScript 编程:异步与同

    JavaScript的优势之一是其如何处理异步代码.异步代码会被放入一个事件队列,等到所有其他代码执行后才进行,而不会阻塞线程.然而,对于初学者来说,书写异步代码可能会比较困难.而在这篇文章里,我将会 ...

  7. VS2013 The Debugger Resource DLL is out of date

    折磨了我一天的问题,亲们,记住,下载vs2013 update5 ,别的方法不用试了,完全没用!

  8. javascript中的__proto__ 和prototype

    不错的一张图

  9. linux exec和xargs的区别

    -exec     1.参数是一个一个传递的,传递一个参数执行一次,效率低     2.文件名有空格等特殊字符也能处理 -xargs      1.一次将参数传给命令,可以使用-n控制参数个数     ...

  10. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...