棋盤分割
time limit:1000ms
memory limit:10000k
total submissions:10807
accepted:3798
description
將乙個8*8的棋盤進行如下分割:將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了(n-1)次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿著棋盤格仔的邊進行)
原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n塊矩形棋盤,並使各矩形棋盤總分的均方差最小。
均方差i為第i塊矩形棋盤的總分。
請程式設計對給出的棋盤及n,求出o'的最小值。
input
第1行為乙個整數n(1 < n < 15)。
第2行至第9行每行為8個小於100的非負整數,表示棋盤上相應格仔的分值。每行相鄰兩數之間用乙個空格分隔。
output
僅乙個數,為o'(四捨五入精確到小數點後三位)。
sample input
3sample output1 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
1.633
分析:均方差的公式較複雜,先將其變形為
轉移方程為d[k,x1,y1,x2,y2]=min(x1<=a//橫著切,分別取上面的矩形和下面的矩形為剩下部分繼續遞迴,取兩者中最小值
}
ac**:
#include #include #include #include #include #include #include #include #include #includeusing namespace std;
int d[16][10][10][10][10]; //d[k,x1,y1,x2,y2]表示左上角座標為(x1,y1),右下角座標為(x2,y2)的矩形切割k次後得到的總平方和的最小值
int sum[10][10]; //s[i][j]表示左上角座標為(1,1),右下角座標為(i,j)的矩形的總分
int m[10][10];
int getsum(int x1,int y1,int x2,int y2)
int fun(int k,int x1,int y1,int x2,int y2) //用到記憶化搜尋
for(int a=x1;a>n)
double result = n*fun(n-1,1,1,8,8)-sum[8][8]*sum[8][8];
printf("%.3f\n",sqrt(result/(n*n)));
}return 0;
}
POJ 1191 棋盤分割
題意 給定一8 8的棋盤,每次沿著邊將棋盤切成兩部份,把一部分放到一邊,再繼續切另一部分,切n 1次得到n個矩形塊,問使n個塊的和能達到的最小方差。題解 顯然可以每次遍歷對矩形塊的橫切和豎切,當dfs到份數等於1,利用二維線段樹組將矩形塊的和求出來返回即可。剪枝 當訪問到同個矩形塊,相同切割份數時,...
POJ 1191 棋盤分割
題目點我 經典的動態規劃題目,首先將標準差公式變形一下 ni 1 xi x 2n n 2 x 2 i 1nx 2i由於x 是固定的,與分割方案無關,所以求最小的標準差就相當於求最小的平方和的分割方案。定義狀態需要五個維度 描述乙個矩形需要四個維度 左上角座標x1 y1 和右下角座標x2 y2 要分割...
棋盤分割 POJ 1191
1 題目型別 dp 概率論。2 解題思路 dp遞推式 以上下切為例 for i x1.x2 sum k x1 y1 x2 y2 min 其中 i 表示切割位置,k 表示切割次數。3 注意事項 遞迴迴圈的呼叫。4 參考部落格 5 實現方法 include iostream include cmath ...