bzoj1048 HAOI2007 分割矩陣

2021-08-09 06:35:06 字數 1439 閱讀 4200

將乙個a∗

b 的數字矩陣進行如下分割:將原矩陣沿某一條直線分割成兩個矩陣,再將生成的兩個矩陣繼續如此分割(當然也可以只分割其中的乙個),這樣分割了(n

−1) 次後,原矩陣被分割成了

n 個矩陣。(每次分割都只能沿著數字間的縫隙進行)原矩陣中每一位置上有乙個分值,乙個矩陣的總分為其所含各位置上分值之和。現在需要把矩陣按上述規則分割成

n個矩陣,並使各矩陣總分的均方差最小。請程式設計對給出的矩陣及

n ,求出均方差的最小值。

最近怎麼做了這麼多蛤省河南省的題啊。

這道題做著真是發自內心的舒

♂爽,幾乎是最暴力的dp,不像有些題真心磨腦子。用s[

i][j

] 記錄二維字首和,f[

a][b

][c]

[d][

k]表示左上角為(a

,b) 右下角為(c

,d) 分成

k 塊的方差總和。然後暴力記憶化搜尋就好了

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define rep(i, a, b) for (int i = a; i <= b; i++)

#define drp(i, a, b) for (int i = a; i >= b; i--)

#define fech(i, x) for(int i = 0; i < x.size(); i++)

#define n 15

inline

int read()

while (ch >= '0' && ch <= '9')

return x * flag;

}inline

void write(int x)

double f[n][n][n][n][n];

int s[n][n];

double ba;

double dfs(int a, int b, int c, int d, int k)

int i, j; tmp = 1e9;

rep(i, a, c - 1) rep(j, 1, k - 1) tmp = min(tmp, dfs(a, b, i, d, j) + dfs(i + 1, b, c, d, k - j));

rep(i, b, d - 1) rep(j, 1, k - 1) tmp = min(tmp, dfs(a, b, c, i, j) + dfs(a, i + 1, c, d, k - j));

return f[a][b][c][d][k] = tmp;

}int main()

BZOJ1048 HAOI2007 分割矩陣

將乙個a b的數字矩陣進行如下分割 將原矩陣沿某一條直線分割成兩個矩陣,再將生成的兩個矩陣繼續如此 分割 當然也可以只分割其中的乙個 這樣分割了 n 1 次後,原矩陣被分割成了n個矩陣。每次分割都只能 沿著數字間的縫隙進行 原矩陣中每一位置上有乙個分值,乙個矩陣的總分為其所含各位置上分值之和。現在需...

BZOJ 1048 HAOI2007 分割矩陣

time limit 10 sec memory limit 162 mb submit 623 solved 449 submit status discuss 將乙個a b的數字矩陣進行如下分割 將原矩陣沿某一條直線分割成兩個矩陣,再將生成的兩個矩陣繼續如此分割 當然也可以只分割其中的乙個 這樣...

BZOJ1055 HAOI 玩具取名

某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...