一道經典的dp題目,應該並沒有提高+拉莫難。。。。。。。。。。。。。。。。。。。。。
思路:
搞懂題意後(這點也很重要),我們首先考慮棋盤的分割情況,不難發現:
然後我們考慮狀態的設計和轉移:
ac**吧:
#include #include#include
#include
using
namespace
std;
intread()
intn, b, x;
int a[10][10
];int s[10][10
];int dp[10][10][10][10][17
];int calc(int x1, int y1, int x2, int
y2)int
main()
for (int i = 1; i <= 8; ++i)
for (int j = 1; j <= 8; ++j)
for (int o = i; o <= 8; ++o)
for (int k = j; k <= 8; ++k)
dp[i][j][o][k][
0] =calc(i, j, o, k),
dp[i][j][o][k][
0] *= dp[i][j][o][k][0
];
for (int p = 1; p < n; ++p)
for (int i = 1; i <= 8; ++i)
for (int j = 1; j <= 8; ++j)
for (int o = i; o <= 8; ++o)
for (int k = j; k <= 8; ++k)
printf("%d
", dp[1][1][8][8][n - 1
]);
}
洛谷 P1436 棋盤分割
如圖 思路 這是乙個很明顯的二維dp題,每一次分割的可以衍生出2種情況 左 上 右 下 2個新矩形 所以最優解一定存在於兩種新情況中,繼續進行遞迴求解即可 dp 左上座標x 左上座標y 右下座標x 右下座標y 分割次數 順推 dp i j k l num 新的上 左 下 右 矩形dp 切割零次時剩餘...
P1436 棋盤分割
題意 給出乙個8 8的棋盤,讓我們將其分割成n塊,每一塊的值為 塊中所有數的和 2 求出在最優的分割方式下的最小值 思路 這是乙個分割問題,但直接考慮分割有點難,所以我們逆向考慮,將其想為填補問題,也就是說,將n塊矩陣填補成乙個8 8的矩陣的最小答案 那麼我們需要以下幾步 1.初始化,我們先求出二維...
P1436 棋盤分割
無 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的兩部分中的任意一塊繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要把棋盤...