dp 棋盤分割 bailian 1191

2022-05-27 01:15:09 字數 1393 閱讀 4706

1191:棋盤分割

檢視提交統計提示提問

總時間限制: 1000ms 記憶體限制: 65536kb

描述將乙個8*8的棋盤進行如下分割:將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了(n-1)次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿著棋盤格仔的邊進行)

原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤按上述規則分割成n塊矩形棋盤,並使各矩形棋盤總分的均方差最小。

均方差,其中平均值,xi為第i塊矩形棋盤的總分。

請程式設計對給出的棋盤及n,求出o'的最小值。

輸入第1行為乙個整數n(1 < n < 15)。

第2行至第9行每行為8個小於100的非負整數,表示棋盤上相應格仔的分值。每行相鄰兩數之間用乙個空格分隔。

輸出僅乙個數,為o'(四捨五入精確到小數點後三位)。

樣例輸入

31 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

**noi 99

一塊棋盤一共有四種分割方式,豎著切然後一遍保留繼續切,一邊切掉,橫著切,一邊保留,一邊切掉,對保留下來的那塊棋盤,繼續做同樣的工作。

#include #include #include int board[9][9];

int sum[9][9];

int res[15][9][9][9][9];

int calsum(int x1, int y1, int x2, int y2)

int min(int a, int b)

int fanc(int n, int x1, int y1, int x2, int y2)

for(int i = x1; i < x2; i++)

for(int j = y1; j < y2; j++)

res[n][x1][y1][x2][y2] = minf;

return minf;

}int main()

}double ans = n * fanc(n, 1, 1, 8, 8) - sum[8][8] * sum[8][8];

printf("%.3f\n", sqrt((double)ans / (n*n)));

return 0;

}

poj1191 棋盤分割 (DP)

題目意思 在乙個8 8的棋盤中要劃分成n塊,並且方差最小 解題思路 用乙個5維的陣列來記錄狀態st k x1 y1 x2 y2 表示在第k次時從 x1,y1 到 x2,y2 的矩形切出的和的平方的和 就是已經分兩塊了,只是這個陣列沒表示從 切 然後遞迴到前面一次,選擇兩個中的一塊繼續遞迴。0ms a...

poj 1191 棋盤分割(dp

題意 將乙個 的棋盤 每個單元正方形有個分值 沿直線 豎或橫 割掉一塊,留下一塊,對留下的這塊繼續這樣操作,總共進行n 1次,得到n塊 1 n 15 矩形,每個矩形的分值就是單元正方形的分值的和,問這n個矩形的最小均方差。此題中,均方差比較,等價於方差比較,等價於平方和比較。狀態 dp x1 y1 ...

poj1191 棋盤分割 (DP)

題目意思 在乙個8 8的棋盤中要劃分成n塊,並且方差最小 解題思路 用乙個5維的陣列來記錄狀態st k x1 y1 x2 y2 表示在第k次時從 x1,y1 到 x2,y2 的矩形切出的和的平方的和 就是已經分兩塊了,只是這個陣列沒表示從 切 然後遞迴到前面一次,選擇兩個中的一塊繼續遞迴。0ms a...