如圖:
思路:這是乙個很明顯的二維dp題,每一次分割的可以衍生出2種情況:左(上)右(下)2個新矩形
所以最優解一定存在於兩種新情況中,繼續進行遞迴求解即可;
dp[左上座標x][左上座標y][右下座標x][右下座標y][分割次數];
順推:dp[i][j][k][l][num] -> 新的上(左)(下)(右)矩形dp+ 切割零次時剩餘部分 sum^2;
逆推:dp[i][j][k][l][num]
方程:
dp[i][j][k][l][num]=min(橫著列舉切割方法,豎著列舉切割方法);//原方程太長,在程式裡;
但是這道題的方程並不是最最重要的問題,推出了方程一樣t的不要不要的
我們在列舉切割方法的時候,需要求出切割出的矩形的 值的平方,但每次都暴力/自定義函式 算一遍的話太浪費了
於是很流暢的就使得我們想到預處理的辦法,利用簡單的容斥原理,就可以在dp[i][j][k][l][0]上記錄一遍不分割
的時候的平方和。
本蒟蒻是通過求了兩遍 字首和得到的差不多為 o(n^2+n^4)(n=8)算的,因為n不大,所以不是很介意;
總複雜度約為 o(8^5*n次詢問+列舉均攤+8^2+8^4) ->o(乙個大常數)
#includeusing namespace std;
int n,x;
int sum[9][9];
int d,b[9][9];
int dp[9][9][9][9][16];
int main(void)}
for(int i=1;i<=8;i++)}
for(int i=1;i<=8;i++)}}}
for(int num=1;num
P1436 棋盤分割
題意 給出乙個8 8的棋盤,讓我們將其分割成n塊,每一塊的值為 塊中所有數的和 2 求出在最優的分割方式下的最小值 思路 這是乙個分割問題,但直接考慮分割有點難,所以我們逆向考慮,將其想為填補問題,也就是說,將n塊矩陣填補成乙個8 8的矩陣的最小答案 那麼我們需要以下幾步 1.初始化,我們先求出二維...
P1436 棋盤分割
無 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的兩部分中的任意一塊繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤...
洛谷 1436 棋盤分割
一道經典的dp題目,應該並沒有提高 拉莫難。思路 搞懂題意後 這點也很重要 我們首先考慮棋盤的分割情況,不難發現 然後我們考慮狀態的設計和轉移 ac 吧 include include include include using namespace std intread intn,b,x int ...