嗯,點開題目,哇!是一道閃亮亮的藍題!
不要被嚇到了,其實,這道題就是乙個簡單的dp啦!
我們設 \(f[x1][y1][x2][y2][c]\) 為以 \((x1,y1)\) 為左上角,以 \((x2,y2)\) 為右下角的矩形分割成c個部分所取得的最大分數。
列舉每一行(列),將其分割成兩部分,然後考慮是繼續分割上(左)邊還是下(右)邊
所以,轉移方程就出來啦!
\(f[x1][y1][x2][y2][c]=min(min(f[x1][y1][x][y2][c-1]+sum[x+1][y1][x2][y2]^2,f[x+1][y1][x2][y2][c-1]+sum[x1][y1][x][y2]^2) ,\)
\(min(f[x1][y1][x2][y][c-1]+sum[x1][y+1][x2][y2]^2,f[x1][y+1][x2][y2][c-1]+sum[x1][y1][x2][y]^2))\)
\((x1 \leq x < x2,y1 \leq y < y2)\)
邊界情況:當 \(c=1,f[x1][y1][x2][y2][c]=sum[x1][y1][x2][y2]\)
最後結果即為 \(f[1][1][8][8][c]\)
\(sum[x1][y1][x2][y2][c]\) 為以 \((x1,y1)\) 為左上角,以 \((x2,y2)\) 為右下角的矩形內的總分數
對 \(sum\) 進行預處理,這裡要算出二維字首和,設為 \(s[i][j]\)
則 \(sum[x1][y1][x2][y2]=s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]\)
好了,就這樣,乙個完美的dp就出來啦!
(也就六重迴圈嗎)
#include #include #include using namespace std;
int n,a[9][9],f[9][9][9][9][16];
int s[9][9],sum[9][9][9][9];
int main()
}for(int i=1;i<=8;i++)}}
}for(int c=2;c<=n;c++){
for(int len1=1;len1<=8;len1++){
for(int i=1,j=len1;j<=8;i++,j++){
for(int len2=1;len2<=8;len2++){
for(int k=1,l=len2;l<=8;k++,l++){
int x1=i,y1=k,x2=j,y2=l;
for(int row=x1;row本人蒟蒻,求大佬指教~~~~
洛谷 1436 棋盤分割
一道經典的dp題目,應該並沒有提高 拉莫難。思路 搞懂題意後 這點也很重要 我們首先考慮棋盤的分割情況,不難發現 然後我們考慮狀態的設計和轉移 ac 吧 include include include include using namespace std intread intn,b,x int ...
P1436 棋盤分割
題意 給出乙個8 8的棋盤,讓我們將其分割成n塊,每一塊的值為 塊中所有數的和 2 求出在最優的分割方式下的最小值 思路 這是乙個分割問題,但直接考慮分割有點難,所以我們逆向考慮,將其想為填補問題,也就是說,將n塊矩陣填補成乙個8 8的矩陣的最小答案 那麼我們需要以下幾步 1.初始化,我們先求出二維...
P1436 棋盤分割
無 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的兩部分中的任意一塊繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤...