description記憶化搜尋。將乙個8*8的棋盤進行如下分割:將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了(n-1)次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿著棋盤格仔的邊進行)
原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n塊矩形棋盤,並使各矩形棋盤總分的均方差最小。
均方差,其中平均值,xi為第i塊矩形棋盤的總分。 請程式設計對給出的棋盤及n,求出o』的最小值。
input 第1行為乙個整數n(1 < n < 15)。
第2行至第9行每行為8個小於100的非負整數,表示棋盤上相應格仔的分值。每行相鄰兩數之間用乙個空格分隔。
output 僅乙個數,為o』(四捨五入精確到小數點後三位)。
注意到平均數x_ bar,n這些均為常數,所以只需要最小化(xi-x_bar)^2之和。
dp[m][x1][y1][x2][y2]表示a[x1..x2][y1..y2]這塊區域切成m份的最小(xi-x_bar)^2之和。
列舉切下來的那一塊即可。
狀態轉移方程見**。
#include
#include
#include
const
int oo=0x3f3f3f3f;
const
int size=8;
double x_bar,dp[17][10][10][10][10];
int n,s[10][10],a[10][10];
double min(double a,double b)
double dfs(int m,int x1,int y1,int x2,int y2)
for (i=y1;i1,x1,y1,x2,i)+dfs(m-1,x1,i+1,x2,y2));
ans=min(ans,dfs(m-1,x1,y1,x2,i)+dfs(1,x1,i+1,x2,y2));
}return dp[m][x1][y1][x2][y2]=ans;
}int main()
x_bar=(double)s[size][size]/n;
printf("%.3f\n",sqrt(dfs(n,1,1,size,size)/n));
}
poj 1191 棋盤分割
棋盤分割 time limit 1000ms memory limit 10000k total submissions 10807 accepted 3798 description 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了 n...
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 要分割...