權當拋磚引玉吧,掌握記搜的方法最重要。
#include#include#includeusing namespace std;
int n,m,k;
bool book[21][21];
int cake[21][21];
int dp[21][21][21][21];
int yt(int x,int y,int w,int h)//返回蛋糕內櫻桃值;x、y表示左上角座標,w、h表示長和寬
int dfs(int x,int y,int w,int h)//開成int型別
{ int ans=2147483647;
if(dp[x][y][w][h]!=-1) return dp[x][y][w][h];//若x,y,w,h的狀態已被搜過,則返回已經儲存的結果
if(yt(x,y,w,h)==1) return 0;//櫻桃值為1時,代價為0(不用再切了)
if(yt(x,y,w,h)==0) return 214748364;//櫻桃值為0時,代價無窮大;但在實現時,inf不能大於int_max/2
for(int i=1;i記憶化搜尋,其實就是動態規劃(dp)與搜尋的完美結合,提高了搜尋的效率,也提供了dp的道路。
所謂動態規劃,就是動態的規劃,其本質就是「狀態轉移」——從一種情況直接或間接推出其他情況。對於本題而言,就是要想清楚如何得到最小代價,是由哪幾部分組成。
so本題具體操作如下:
定義一四維陣列dp,儲存在x,y,w,h的狀態下的最小代價。
定義一int型別函式dfs,其返回值即為代價。若蛋糕已有解,則直接返回現有代價。否則若當前蛋糕內櫻桃值為1,返回代價為0。若當前蛋糕內櫻桃值為0,返回代價為「無窮大」。否則繼續列舉可供下刀的行和列,繼續對兩側進行搜尋,打擂台尋找最小代價。遍歷完所有情況後,儲存當前結果並返回上一層。
小結:記憶化搜尋與暴搜的最大區別在於,前者對搜尋進行了優化,對當前結果進行了記錄,避免了重複搜尋。
切蛋糕 切西瓜(數學)
1 n條直線最多分平面問題 題目大致如 n條直線,最多可以把平面分為多少個區域。析 可能你以前就見過這題目,這充其量是一道初中的思考題。但乙個型別的題目還是從簡單的入手,才容易發現規律。當有n 1條直線時,平面最多被分成了f n 1 個區域。則第n條直線要是切成的區域數最多,就必須與每條直線相交且不...
切蛋糕(貪心 or 優先佇列)
第一行包括兩個數t,n,表示有n個蛋糕,最小的蛋糕的質量與最大的蛋糕的質量的比值不小於t 接下來n行,每行乙個數wi,表示n個蛋糕的質量輸出包括一行,為最小切割的刀數 資料保證切割次數不超過500示例1 0.99 3 2000 3000 4000 6 0.5 t 1 1 n 1000 1 wi 10...
qduoj 帥氣的HYC切蛋糕
描述我們的帥氣的hyc獲得了蛋糕後,當然要找小夥伴分享啦,這個蛋糕是乙個半徑為r,高度為h的圓柱形蛋糕,蛋糕上面平鋪一層奶油,由於這個蛋糕太大,於是他找到ltwy幫他切蛋糕。ltwy說要考考他,如果回答正確就幫忙,否則整個蛋糕就歸ltwy了。hyc猶豫了一下,問是什麼問題.ltwy說題目很簡單,將蛋...