PKU1191 chessboard devision
2010-08-28 10:24
155 查看
在市图的电子阅览室搞了这道DP。估计这个就是我这个假期的最后一道题了。难度不大,状态转移也比较好想,分横纵两次切割。F[xa,ya,xb,yb,k] 表示把矩阵 [xa,ya,xb,yb] 分割成 k 份的最小数值。
开学之后可能不会很有时间,应该会弄一弄简单图论,在巩固一下搜索跟DP。
开学之后可能不会很有时间,应该会弄一弄简单图论,在巩固一下搜索跟DP。
program chessboard; const inf=200000000; var data,sum:array[0..9,0..9] of longint; score:array[0..9,0..9,0..9,0..9] of longint; f:array[0..9,0..9,0..9,0..9,0..16] of real; n,count:longint; aver:real; function getmin(a,b:real):real; begin if a<b then exit(a) else exit(b); end; procedure init; var i,j:longint; begin fillchar(data,sizeof(data),0); count:=0; readln(n); for i:=1 to 8 do for j:=1 to 8 do read(data[i,j]); end; procedure calcsum; var i,j:longint; begin fillchar(sum,sizeof(sum),0); for i:=1 to 8 do for j:=1 to 8 do sum[i,j]:=data[i,j]-sum[i-1,j-1]+sum[i-1,j]+sum[i,j-1]; aver:=sum[8,8]/n; end; procedure calcscore; var xa,ya,xb,yb:longint; begin for xa:=1 to 8 do for ya:=1 to 8 do for xb:=xa to 8 do for yb:=ya to 8 do score[xa,ya,xb,yb]:=sum[xb,yb]+sum[xa-1,ya-1]-sum[xa-1,yb]-sum[xb,ya-1]; end; function dp(xa,ya,xb,yb,k:longint):real; var i,j:longint; tmpa,tmpb:real; begin if f[xa,ya,xb,yb,k]>0 then exit(f[xa,ya,xb,yb,k]); if k=1 then begin f[xa,ya,xb,yb,k]:=sqr(score[xa,ya,xb,yb]-aver); exit(f[xa,ya,xb,yb,k]); end; tmpa:=inf; tmpb:=inf; for i:=xa to xb-1 do begin tmpa:=getmin(dp(xa,ya,i,yb,k-1)+sqr(score[i+1,ya,xb,yb]-aver),tmpa); tmpa:=getmin(sqr(score[xa,ya,i,yb]-aver)+dp(i+1,ya,xb,yb,k-1),tmpa); end; for j:=ya to yb-1 do begin tmpb:=getmin(dp(xa,ya,xb,j,k-1)+sqr(score[xa,j+1,xb,yb]-aver),tmpb); tmpb:=getmin(sqr(score[xa,ya,xb,j]-aver)+dp(xa,j+1,xb,yb,k-1),tmpb); end; f[xa,ya,xb,yb,k]:=getmin(tmpa,tmpb); exit(f[xa,ya,xb,yb,k]); end; procedure main; begin fillchar(f,sizeof(f),0); f[1,1,8,8,n]:=dp(1,1,8,8,n); end; procedure outit; var ans:real; begin ans:=sqrt(f[1,1,8,8,n]/n); writeln(ans:0:3); end; begin assign(input,'a.in'); reset(input); assign(output,'a.out'); rewrite(output); init; calcsum; calcscore; main; outit; close(input); close(output); end.
相关文章推荐
- 【DP+记忆化搜索】PKU-1191-棋盘分割
- pku 2446 Chessboard
- pku 1191 棋盘分割 DP / 记忆化搜索
- pku 1191 棋盘分割(DP,一点点数学)
- PKU 1191
- pku1191 棋盘分割 DP
- PKU 1191 棋盘分割 递归解法
- pku1083 Moving Tables
- pku 1410(判断线段是否跟矩形相交)
- pku2485 Highways 最短高速公路问题
- pku 1679 The Unique MST 次小·生成树
- pku 1584 A Round Peg in a Ground Hole 计算几何——凸多边形判断+点在多边形内判断+求点到直线距离
- pku 2195 Going Home 最小费最大流问题
- pku2992 Divisors
- Pku 1611 The Suspects
- pku2904: The Mailboxes Manufacturers Problem
- 【转】pku 2104 K-th Number 求某区间第k小数 归并排序+线段树
- pku 1691 Painting A Board DFS 抽象建图 + 拓扑排序
- pku3083Children of the Candy Corn-模拟+bfs
- [二分] PKU 1840 Eqs