[区间DP 中位数] BZOJ 2933 [Poi1999]地图 Map

247人阅读 评论(1) 收藏 举报
分类:

区间DP没什么好想的  mn2也懒得优化了

中位数 这个递推好啊


P[i,j]有定义式为

P[i,j]=Sum{ Abs( S[k]-Mid(i,j) ) | i<=k<=j } (Mid(i,j)为S[i]..S[j]的中值)

但是如果我们直接这样求,时间复杂度高达O(N^3 + N^2*M),关键在于求P[i,j]时浪费了太多时间。其实我们可以递推求出P[i,j]。

递推式

P[i,j]=P[i+1,j] + Mid(i,j) - S[i]

边界

P[i,i]=0

来自BYVOID %%%


#include<cstdio>  
#include<cstdlib>  
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

const int N=3005;
const int M=15;

int n,m;  
ll a[N],f[N][M],w[N][N];

int main(){
  freopen("t.in","r",stdin);
  freopen("t.out","w",stdout);
  scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%lld",&a[i]);  
  sort(a+1,a+1+n);  
  for (int j=1;j<=n;j++)
    for (int i=j-1;i;i--) 
      w[i][j]=w[i+1][j]+a[((i+1)+j)/2]-a[i];
  memset(f,0x3f,sizeof(f));
  f[0][0]=0;
  for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
      for (int k=0;k<i;k++)  
	f[i][j]=min(f[i][j],f[k][j-1]+w[k+1][i]);
  printf("%lld\n",f[n][m]);
  return 0;  
}  




查看评论

BZOJ 2933([Poi1999]地图-区间Dp)

2933: [Poi1999]地图 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 7  Solved: 7 [Submit][Status] ...
  • nike0good
  • nike0good
  • 2013-10-09 13:39:05
  • 1245

[BZOJ2936][POI1999] 降水(堆+bfs:floodfill)

题目描述传送门题解传说这种积水问题有个学名叫floodfill?首先可以发现最外围的一坨块上是不可能积水的。而这些块里面积水的高度取决于高度最小的那个块——木桶效应! 由此可以猜测:块的高度,也可以...
  • Clove_unique
  • Clove_unique
  • 2016-10-26 21:58:55
  • 575

bzoj 2933(区间dp)

传送门 题解:先按照a排序,预处理前缀和,然后预处理区间代价(每次贪心地选中位数然后计算),最后dp一次即可。dp[i][j]表示前i个地区分成j个颜色的最小代价。 吐槽一下,有位大哥做bzoj3...
  • KGV093
  • KGV093
  • 2017-09-25 23:07:14
  • 66

[欧拉回路] BZOJ 2935 [Poi1999]原始生物 Primitivus

建图十分明显 就是求最短的路径覆盖所有边 对于每个连通分量  要是存在欧拉回路 那么就是边数+1 如果不存在欧拉回路 那么加边成为欧拉回路 然后任意拆一条边 所以就是边数 #include #in...
  • u014609452
  • u014609452
  • 2016-12-17 11:12:56
  • 452

bzoj1996(区间dp)

这题只要知道是区间do,就不难做。 首先f【l】【r】表示可以满足l~r这个区间的初始队形的方案数,显然我们发现,此时我们加入的队员,只有可能在最左边和最右边,也就是从f【l】【r-1】和f【l+1】...
  • zhhx2001
  • zhhx2001
  • 2016-08-18 14:24:45
  • 299

[BZOJ 1303] CQOI 2009 中位数图 · 数学

一个大于b的数和一个小于b的数可以互相抵消,所以我们用1和-1表示。 从b向两边扩展,left[i]表示b左边抵消后有i个数比b小的可能数,right[i]表示b右边抵消后有i个数比b大的可能数。 ...
  • ycdfhhc
  • ycdfhhc
  • 2015-06-19 10:18:30
  • 741

bzoj 1367: [Baltic2004]sequence(中位数+可并堆)

1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 935  Solved: 351 [Submit]...
  • clover_hxy
  • clover_hxy
  • 2016-05-08 17:16:14
  • 931

[区间DP 思路题] BZOJ 4350 括号序列再战猪猪侠

蒟蒻不会做 这里讲的蛮详细的#include #include #include #include #define read(x) scanf("%d",&(x)) #define cl(x) me...
  • u014609452
  • u014609452
  • 2017-03-11 20:00:56
  • 362

bzoj4953 [Wf2017]Posterize(区间dp)

首先把原题转化一下,就是有256个位置,有n个位置上有人,你可以在k个位置上插旗,每个人都会走到离自己最近的旗子,求所有人走的距离的平方和的最小值。f[i][j]表示前i个位置,放了j个旗子,其中第i...
  • Icefox_zhx
  • Icefox_zhx
  • 2017-09-03 20:28:23
  • 211

bzoj1303: [CQOI2009]中位数图

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1303 题意:中文题。。 分析:这题还是挺水的,既然是一个1~n的排列,那么我们自然就可以把...
  • Fsss_7
  • Fsss_7
  • 2016-01-03 17:33:08
  • 217
    个人资料
    持之以恒
    等级:
    访问量: 40万+
    积分: 1万+
    排名: 1233
    文章分类
    最新评论