NOI1999 poj1191 棋盤分割

2021-07-15 15:32:57 字數 1198 閱讀 7469

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 要分割...