記憶化搜尋 dfs 遞迴 Chocolate

2021-09-21 18:22:24 字數 1786 閱讀 4345

有一塊巧克力(每乙個單位有一定的美味值),判斷是否可以把他分為k塊美味值相等的小巧克力

charlie 有一塊巧克力。

這塊巧克力是矩形的,有 n 行 m 列一共 n × m 個大小相同的小塊,每一小塊都有乙個美味值 ai,j。

charlie 有 k 個朋友,他希望把巧克力分給這些朋友。

charlie 按如下方法分配巧克力:做 k-1 次分割,每次拿出一塊巧克力,將它

沿水平或豎直方向分成兩塊矩形的巧克力。分割完成後一共有 k 塊巧克力,charlie

會把這 k 塊巧克力一一分給他的朋友們。

一塊巧克力的美味值定義為它的所有小塊的美味值之和。charlie 想知道是否

存在一種可行的方案,使每個朋友獲得的巧克力的美味值相等。

本題有多組測試資料。第一行乙個正整數 t 表示資料組數。

對於每組測試資料:

第一行 3 個正整數表示 n, m, k。

接下來 n 行,每行 m 個正整數,表示每一小塊的美味值

對於每個測試資料,輸出一行 yes 或 no,表示是否存在可行方案。

2

1 3 2

2 1 1

2 2 3

2 33 1

yes

no

遞迴每一塊是否能分開來,每一塊列舉怎麼切(詳情見**)

#include

#include

#include

using

namespace std;

int t,n,m,k,x,sum,a[30]

[30],f[30]

[30][

30][30

];bool p[30]

[30][

30][30

],pp[30]

[30][

30][30

];bool

dfs(

int x1,

int y1,

int x2,

int y2)

intmain()

for(

int i=

1;i<=n;

++i)

for(

int j=

1;j<=m;

++j)

for(

int i1=i;i1<=n;

++i1)

for(

int j1=j;j1<=m;

++j1)

f[i]

[j][i1]

[j1]

=a[i1]

[j1]

-a[i-1]

[j1]

-a[i1]

[j-1

]+a[i-1]

[j-1];

//求出每一塊

sum=f[1]

[1][n]

[m]/k;

//平分

if(f[1]

[1][n]

[m]%k)

printf

("no\n");

//無法整分

elseif(

dfs(1,

1,n,m)

)printf

("yes\n");

else

printf

("no\n");

}}

滑雪 DFS 記憶化搜尋

michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...

總結 遞迴 記憶化搜尋 遞迴

遞迴函式執行時分為函式 前進段和返回段,真正明白並時刻記住這個才真正掌握了遞迴。寫遞迴時三點 開始定義的 引數,結束條件 邊界 若干if語句 遞迴呼叫及 返回段運算 一般引數中總有乙個代表遞迴層數。遞迴結束返回時要考慮是否修改了全域性變數,並將其改回,這個是為回溯做準備。記憶化搜尋 解決了遞迴時大量...

記憶化搜尋(遞迴)講解

記憶化的本質是 先記錄,後返回 記住 一定要記錄,否則就是普通的遞迴 如果表中有,則直接返回。1.斐波那契寫法 1 1 2 3 5 8 13 結果 1134903170 include include include define ll long long using namespace std l...