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;
}
#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;
}
相关文章推荐
- poj_1191 棋盘分割(dp记忆化搜索)
- poj 1191棋盘分割
- POJ 1191 棋盘分割
- POJ 1191 棋盘分割(DP)
- POJ 1191 棋盘分割(记忆化搜索)
- poj1191 棋盘分割 dp
- poj 1191 棋盘分割
- 洛谷 P1436 POJ 1191 [NOI1999 D1T2] 棋盘分割
- POJ1191 棋盘分割
- POJ 1191 棋盘分割
- poj1191--棋盘分割(dp)
- poj-1191-棋盘分割
- POJ 1191 棋盘分割(记忆化搜)
- 棋盘分割----POJ1191----DP
- poj 1191 棋盘分割 dp-进阶
- POJ 1191 棋盘分割
- poj 1191 棋盘分割(记忆化dp+递归)
- poj 1191(棋盘分割)
- 【poj 1191】棋盘分割 题解&代码(C++)
- poj1191——分割棋盘求最小均方差,记忆化搜索