您的位置:首页 > 其它

PKU1191 chessboard devision

2010-08-28 10:24 155 查看
在市图的电子阅览室搞了这道DP。估计这个就是我这个假期的最后一道题了。难度不大,状态转移也比较好想,分横纵两次切割。F[xa,ya,xb,yb,k] 表示把矩阵 [xa,ya,xb,yb] 分割成 k 份的最小数值。
开学之后可能不会很有时间,应该会弄一弄简单图论,在巩固一下搜索跟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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: