題意:將乙個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...