題意:給出乙個8*8的棋盤,讓我們將其分割成n塊,每一塊的值為(塊中所有數的和)^2
求出在最優的分割方式下的最小值;
思路:這是乙個分割問題,但直接考慮分割有點難,所以我們逆向考慮,將其想為填補問題,也就是說,將n塊矩陣填補成乙個8*8的矩陣的最小答案;
那麼我們需要以下幾步:
1.初始化,我們先求出二維字首和,方便下文求出每一塊的平方和
2.設定乙個dp陣列 (五維) 第一維為塊數,剩下四維表示矩陣的左上端點座標和右下端點座標。
3.進行計算,我們將塊數從小到大進行列舉,將考慮的矩陣也從小到大列舉,然後即可,
對於乙個矩陣的分割操作,我們可以有兩種,假設目前矩陣為(x1,y1)到(x2,y2);
第一種: 將矩陣進行列方面的切割,這裡又可以分為兩種,假設我們切在k列
1.將k+1以及後面的作為被切的矩陣
2.將k+1前面的作為被切的矩陣
第二種:同上,進行行方面的切割
**如下:
1 #include2 #include3 #include4#define ll long long
5#define inf 0x3f3f3f3f
6using
namespace
std;
7int m,a[20][20],sum[20][20
];8 ll f[20][10][10][10][10];9
const
int n=8
;10 inline ll calc(int x1,int y1,int x2,int
y2)14
15int
main()
45 printf("
%lld\n
",f[m][1][1
][n][n]);
46return0;
47 }
P1436 棋盤分割
無 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的兩部分中的任意一塊繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤...
洛谷 P1436 棋盤分割
如圖 思路 這是乙個很明顯的二維dp題,每一次分割的可以衍生出2種情況 左 上 右 下 2個新矩形 所以最優解一定存在於兩種新情況中,繼續進行遞迴求解即可 dp 左上座標x 左上座標y 右下座標x 右下座標y 分割次數 順推 dp i j k l num 新的上 左 下 右 矩形dp 切割零次時剩餘...
洛谷P1436 棋盤分割 題解 二維區間DP
這道題目和 演算法藝術與資訊學競賽 的題目描述稍微有點區別 這裡是求平方和的最小值,書上是方差的最小值 不過解法都是一樣的,就是區間dp,我這裡使用記憶化搜尋實現。f r1 c1 r2 c2 m 表示以 r1,c1 為左上角的格仔,以 r2,c2 為右下角的格仔,並且分成 m 份的最小平方和。實現 ...