老BOJ 16 棋盘分割
2014-08-03 00:39
148 查看
棋盘分割
Description
将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)
原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。
均方差
,其中平均值
,xi为第i块矩形棋盘的总分。
请编程对给出的棋盘及n,求出O'的最小值。
Input
第1行为一个整数n(1
< n < 15)。
第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。
Output
仅一个数,为O'(四舍五入精确到小数点后三位)。
Sample Input
3
1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 3
Sample Output
1.633
Accept:46 | Submit:186 |
Time Limit:1000MS | Memory Limit:65536KB |
将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)
原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。
均方差
,其中平均值
,xi为第i块矩形棋盘的总分。
请编程对给出的棋盘及n,求出O'的最小值。
Input
第1行为一个整数n(1
< n < 15)。
第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。
Output
仅一个数,为O'(四舍五入精确到小数点后三位)。
Sample Input
3
1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 3
Sample Output
1.633
//DP枚举,注意输出用%f不可以用%lf #include<cstdlib> #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #define ll long long #define inf 0xffffff using namespace std; int a[9][9],bak[9][9][9][9]; double dp[16][9][9][9][9]; int sum(int x1,int y1,int x2,int y2){ int i,ret=0,j; for(i=x1;i<=x2;i++) for(j=y1;j<=y2;j++) ret+=a[i][j]; return ret*ret; } double cut(int k,int x1,int y1,int x2,int y2){ int i,j; if(dp[k][x1][y1][x2][y2]>=0)return dp[k][x1][y1][x2][y2]; if(k==1)return bak[x1][y1][x2][y2]; dp[k][x1][y1][x2][y2]=inf; for(i=x1;i<x2;i++)dp[k][x1][y1][x2][y2]=min(dp[k][x1][y1][x2][y2],min(cut(k-1,x1,y1,i,y2)+bak[i+1][y1][x2][y2],cut(k-1,i+1,y1,x2,y2)+bak[x1][y1][i][y2])); for(i=y1;i<y2;i++)dp[k][x1][y1][x2][y2]=min(dp[k][x1][y1][x2][y2],min(cut(k-1,x1,y1,x2,i)+bak[x1][i+1][x2][y2],cut(k-1,x1,i+1,x2,y2)+bak[x1][y1][x2][i])); return dp[k][x1][y1][x2][y2]; } int main(){ int i,j,k,l,n; double ans,all=0; scanf("%d",&n); for(i=1;i<9;i++) for(j=1;j<9;j++) scanf("%d",&a[i][j]),all+=a[i][j]; for(i=1;i<9;i++) for(j=1;j<9;j++) for(k=i;k<9;k++) for(l=j;l<9;l++) bak[i][j][k][l]=sum(i,j,k,l); memset(dp,-1,sizeof dp); all/=n; all*=all; cut(n,1,1,8,8); printf("%.3f\n",sqrt(dp [1][1][8][8]/n-all)); return 0; }
相关文章推荐
- 16:棋盘分割
- poj 1191(棋盘分割)
- code vs 1711 棋盘分割 (dp)
- POJ 1191 棋盘分割(DP)
- VTK修炼之道16:图像处理_窗口分割和图像融合(Viewport&vtkImageBlend)
- POJ1191 棋盘分割(DP)
- 【DP】【统计】【NOI1999】棋盘分割
- poj棋盘分割(记忆化)
- [poj1191][noi99]棋盘分割
- 代码开源 | COCO-16 图像分割冠军:首个全卷积端到端实例分割模型(HR)
- [POJ] 1191 [LUOGU] P1436 棋盘分割
- 经典递归问题--棋盘分割 POJ--1191
- poj1191棋盘分割—典型动态规划
- poj 1191 棋盘分割
- 百练+DFS+棋盘分割,隔一行照样可以
- poj 1191 棋盘分割(dp)
- poj 1191 棋盘分割
- 【POJ 1191】 棋盘分割(DP)
- POJ-1191 棋盘分割
- codevs1711/洛谷P1436棋盘分割(noi1999)