您的位置:首页 > 其它

poj 1191 棋盘分割

2014-06-10 21:31 411 查看
http://poj.org/problem?id=1191

这道题先是预处理,在dp处理。

dp[k][x1][y1][x2][y2]=min(min(dp[k+1][x1][y1][a][y2]+s[a+1][y1][x2][y2],dp[k+1][a+1][y1][x2][y2]+s[x1][y1][a][y2]),min(dp[k+1][x1][y1][x2][b]+s[x1][b][x2][y2],dp[k+1][x1][b+1][x2][y2]+s[x1][y1][x2][b]);

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf=1<<30;

int dp[15][15][15][15][15];
int g[20][20];
int ans[20][20][20][20];
int n;

void inti()
{
for(int x=0; x<9; x++)
{
for(int y=0; y<9; y++)
{
for(int x1=x; x1<9; x1++)
{
for(int y1=y; y1<9; y1++)
{
int c=0;
for(int i=x; i<=x1; i++)
{
for(int j=y; j<=y1; j++)
{
c+=g[i][j];
}
}
ans[x][y][x1][y1]=c*c;
ans[x1][y1][x][y]=c*c;
ans[x][y1][x1][y]=c*c;
ans[x1][y][x][y1]=c*c;
}
}
}
}
}

int deal(int k,int x1,int y1,int x2,int y2)
{
if(dp[k][x1][y1][x2][y2]>=0) return dp[k][x1][y1][x2][y2];
if(k==n-1) return ans[x1][y1][x2][y2];
dp[k][x1][y1][x2][y2]=inf;
int ans1=0;
for(int a=x1; a<x2; a++)
{
ans1=min(deal(k+1,x1,y1,a,y2)+ans[a+1][y1][x2][y2],deal(k+1,a+1,y1,x2,y2)+ans[x1][y1][a][y2]);
dp[k][x1][y1][x2][y2]=min(dp[k][x1][y1][x2][y2],ans1);
}
for(int b=y1; b<y2; b++)
{
ans1=min(deal(k+1,x1,y1,x2,b)+ans[x1][b+1][x2][y2],deal(k+1,x1,b+1,x2,y2)+ans[x1][y1][x2][b]);
dp[k][x1][y1][x2][y2]=min(dp[k][x1][y1][x2][y2],ans1);
}
return dp[k][x1][y1][x2][y2];
}

int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(dp,-1,sizeof(dp));
int cnt=0;
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
{
scanf("%d",&g[i][j]);
cnt+=g[i][j];
}
}
inti();
deal(0,0,0,7,7);
printf("%.3f\n",sqrt((dp[0][0][0][7][7]*1.0)/n-((cnt*1.0)/n)*((cnt*1.0)/n)));
}
return 0;
}


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