Luogu1436 棋盤分割(動態規劃)

2022-04-30 09:51:14 字數 1365 閱讀 7846

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

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

請程式設計對給出的棋盤及n,求出平方和的最小值。

輸入格式:

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

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

輸出格式:

僅乙個數,為平方和。

輸入樣例#1:

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:

最開始被告知這道題是區間dp,做完之後發現好像並沒什麼太大的關係,直接列舉就可以了。

\(f[i][x1][y1][x2][y2]\)表示矩形\((x1,y1),(x2y2)\)分成了i塊後,獲得的最大值。這裡注意不能列舉矩陣中的小矩陣來轉移,這樣有可能會切重。所以我們直接列舉長和寬的斷點來轉移即可。

注意初始狀態。

#include#include#include#include#includeusing namespace std;

int read()

while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*w;

}int n;

int a[15][15],sum[15][15];

int dp[16][11][11][11][11];

int get(int x1,int y1,int x2,int y2,int x3,int y3)

void init()}}

}}int main()

}init();

for(int i=2;i<=n;i++)}}

}}cout<

}

Luogu 1436 棋盤分割 題解 DP

題面 設f k i j x y 為切了k次從 i,j 到 x,y 矩形的最大解。那麼dp方程就很好寫出來了。f k i j x y min f k i j x y min f 1 i j a y f k 1 a 1 j x y f k 1 i j a y f 1 a 1 j x y f k i j ...

洛谷 1436 棋盤分割

一道經典的dp題目,應該並沒有提高 拉莫難。思路 搞懂題意後 這點也很重要 我們首先考慮棋盤的分割情況,不難發現 然後我們考慮狀態的設計和轉移 ac 吧 include include include include using namespace std intread intn,b,x int ...

P1436 棋盤分割

題意 給出乙個8 8的棋盤,讓我們將其分割成n塊,每一塊的值為 塊中所有數的和 2 求出在最優的分割方式下的最小值 思路 這是乙個分割問題,但直接考慮分割有點難,所以我們逆向考慮,將其想為填補問題,也就是說,將n塊矩陣填補成乙個8 8的矩陣的最小答案 那麼我們需要以下幾步 1.初始化,我們先求出二維...