poj 1191 棋盤切割(dp

2022-09-17 06:00:12 字數 1209 閱讀 2518

題意:將乙個8*8的棋盤(每乙個單元正方形有個分值)沿直線(豎或橫)割掉一塊,留下一塊,對留下的這塊繼續這樣操作,總共進行n - 1次,得到n塊(1 < n < 15)矩形,每乙個矩形的分值就是單元正方形的分值的和,問這n個矩形的最小均方差。

id=1191" rel="noopener">id=1191

——>>此題中。均方差比較,等價於方差比較,等價於平方和比較。

狀態:dp[x1][y1][x2][y2][i]表示將(x1, y1)到(x2, y2)的矩形切割i次的最小平方和。

狀態轉移方程:dp[x1][y1][x2][y2][i] = min(dp[x1][y1][j][y2][i - 1] + nsquare[j + 1][y1][x2][y2], dp[j + 1][y1][x2][y2][i - 1] + nsquare[x1][y1][j][y2], );(水平方向分割)

dp[x1][y1][x2][y2][i] = min(dp[x1][y1][x2][j][i - 1] + nsquare[x1][j + 1][x2][y2], dp[x1][j + 1][x2][y2][i - 1] + nsquare[x1][y1][x2][j]);(豎直方向分割)

兩個方向再取最小值。

#include #include #include #include using std::sqrt;

using std::min;

const int width = 8;

const int maxn = 15 + 1;

const int inf = 0x3f3f3f3f;

int a[width + 1][width + 1];

int nsum[width + 1][width + 1][width + 1][width + 1];

int nsquare[width + 1][width + 1][width + 1][width + 1];

int dp[width + 1][width + 1][width + 1][width + 1][maxn];

void init()}}

}}void dp(int n)

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

}}

}}void output(int n)

void read()

}}int main()

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...