您的位置:首页 > 其它

poj 1191 棋盘分割

2013-08-08 22:53 267 查看
刘汝佳黑书上的题目。没什么好说的,就是记忆化搜索,懒人必备的动态规划算法。

#include<iostream>
#include<math.h>
#include<cmath>
#include<stdio.h>
using namespace std;
int s[9][9][9][9];
int dp[15][9][9][9][9];
int map[9][9];
int n;
int mini(int x,int y)
{
if(x<y)
return x;
return y;
}
int search(int left,int x1,int y1,int x2,int y2)
{
if(left==1)
{
dp[left][x1][y1][x2][y2]=s[x1][y1][x2][y2];
return dp[left][x1][y1][x2][y2];
}
if(dp[left][x1][y1][x2][y2]>=0)
return dp[left][x1][y1][x2][y2];
int minx=100000000;
for(int a=y1;a<y2;a++)
{
minx=mini(minx,search(left-1,x1,y1,x2,a)+s[x1][a+1][x2][y2]);
minx=mini(minx,search(left-1,x1,a+1,x2,y2)+s[x1][y1][x2][a]);
}
for(int a=x1;a<x2;a++)
{
minx=mini(minx,search(left-1,x1,y1,a,y2)+s[a+1][y1][x2][y2]);
minx=mini(minx,search(left-1,a+1,y1,x2,y2)+s[x1][y1][a][y2]);
}
dp[left][x1][y1][x2][y2]=minx;
return dp[left][x1][y1][x2][y2];
}
int main()
{
int i,j,k,p,q,sum;
double ans;
cin>>n;
sum=0;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
{
cin>>map[i][j];
sum=sum+map[i][j];
}
for(i=1;i<=n;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
for(p=1;p<=8;p++)
for(q=1;q<=8;q++)
dp[i][j][k][p][q]=-1;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
for(k=1;k<=8;k++)
for(p=1;p<=8;p++)
{
if(k>=i&&p>=j)
{
s[i][j][k][p]=0;
for(int x=i;x<=k;x++)
for(int y=j;y<=p;y++)
s[i][j][k][p]=s[i][j][k][p]+map[x][y];
s[i][j][k][p]=s[i][j][k][p]*s[i][j][k][p];
s[k][p][i][j]=s[i][j][k][p];
s[i][p][k][j]=s[i][j][k][p];
s[k][j][i][p]=s[i][j][k][p];
}
}
ans=sqrt(1.0*search(n,1,1,8,8)/n-(sum*1.0/n)*(sum*1.0/n));
printf("%.3f\n",ans);
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: