有一塊巧克力(每乙個單位有一定的美味值),判斷是否可以把他分為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...