您的位置:首页 > 其它

POJ 1191 棋盘分割【区间类DP】

2013-03-02 09:40 465 查看
http://poj.org/problem?id=1191

1>根据公式化简:

View Code

/**
*  POJ 1191 棋盘分割
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[9][9], F[15][9][9][9][9];
int minx(int a1, int a2, int a3)
{
int minnum=99999999;
if(a1<minnum) minnum=a1;
if(a2<minnum) minnum=a2;
if(a3<minnum) minnum=a3;
return minnum;
}
int get(int x1,int y1,int x2,int y2)          //用来计算分割出来块的总分
{
return a[x2][y2]-a[x2][y1-1]-a[x1-1][y2]+a[x1-1][y1-1];
}
int main()
{
int n, i, j, x1, y1, x2, y2, aa, b;
while(scanf("%d", &n)!=EOF)
{
memset(F, 0, sizeof(F));
memset(a, 0, sizeof(a));
for(i=1; i<=8; i++)
for(j=1; j<=8; j++)
{
scanf("%d",&a[i][j]);
a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
}
for(i=1; i<=n; i++)
for(x1=1; x1<=8; x1++)
for(y1=1; y1<=8; y1++)
for(x2=1; x2<=8; x2++)
for(y2=1; y2<=8; y2++)
{
if(i==1||x1==x2||y1==y2)
{
F[i][x1][y1][x2][y2]=get(x1, y1, x2, y2)*get(x1, y1, x2, y2);
continue;
}
int t1=99999999;
for(aa=y1; aa<y2; aa++)
t1=minx(t1, F[i-1][x1][aa+1][x2][y2]+get(x1, y1, x2, aa)*get(x1, y1, x2, aa),
F[i-1][x1][y1][x2][aa]+get(x1, aa+1, x2, y2)*get(x1, aa+1, x2, y2));
for(b=x1; b<x2; b++)
t1=minx(t1, F[i-1][b+1][y1][x2][y2]+get(x1, y1, b, y2)*get(x1, y1, b, y2),
F[i-1][x1][y1][b][y2]+get(b+1, y1, x2, y2)*get(b+1, y1, x2, y2));
F[i][x1][y1][x2][y2]=t1;
}
double tt=F
[1][1][8][8]*1.0/n-pow(a[8][8]*1.0/n, 2.0);
printf("%.3lf\n", sqrt(tt));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: