重新回顧了一下 , 記憶化搜尋。
記憶化搜尋,本身是一種搜尋演算法, 應該用 深度優先搜尋。就是一條路走到底,看看這條路和其他路的結果是否有差異, 是否更優秀。記憶化, 只是在搜尋的時候, 順便記錄了一下當前位置的結果,另外一條路過來的時候,哎呀, 突然發現有結果了,就不用再走一次了。
在這裡, 自己在dfs初始化 的時候,出現了問題。 不能初始化為該位置的乳酪數量 , 有可能四周的乳酪數量都比當前位置的少 , 這時返回結果的dp[x][y]應該等於0 , 就是該位置不會再往下走了 ,往下走,再怎麼加上乳酪的數量 , 都只能加0 了。。其實 , 是不是每次都加上當前位置的 , 最後會重複相加啊。?
#include#include#include#includeusing namespace std;
int dp[105][105];
int num[105][105];
int nextx[4] = ;
int nexty[4] = ;
int n,k;
int dfs(int x , int y)
if( num[xx][yy] > num[x][y])
}dp[x][y] = ans + num[x][y] ; //返回的時候 , 如果前面初始化為num[x][y] , 那就出問題了。
// printf("dp[%d][%d] = %d\n" , x , y , dp[x][y]);
return dp[x][y];
}int main()
// dp[1][1] = num[1][1];
int res = dfs(1,1);
cout後來看了那個記憶化搜尋,,,就跟自己之前做的那個滑雪的,一樣一樣的鴨。
最後,,再舔一下 001 號講解員。
hdu 1078 記憶化搜尋
hdu 1078 題意 每次可以朝乙個方向走k格,必須走到乙個數值比當前值大的點,問最多數值加起來能有多少,走到不能再走。一開始定義錯了,定義dp i j 為以 i,j 為終點時所能得到的最大值。dp i t dx j t dy max dp i t dx j t dy dp i j a i t d...
hdu 1078(記憶化搜尋)
題意 老鼠每次最多走k步停下來,停下的這個位置只能比上乙個停留的位置大,並獲取其價值,每次只能水平或垂直走,問最大能得到的價值 解題思路 這道題可以用記憶化搜尋解決,dp i j 表示老鼠在位置 i,j 時可以達到的最優值。因為dp的狀態是乙個有向無環圖,剛開始想會不會走死迴圈,但是這道題有乙個條件...
HDU 1078 記憶化搜尋
題目鏈結 題意是老鼠一開始在 0,0 點,每個點都有乳酪數目,如果老鼠走到 的話就獲得所有乳酪,老鼠只能水平走和垂直走,問怎麼走才能獲得最 酪數。輸入n和k,n是地圖大小,k是老鼠能走多遠。很簡單的一道題,注意超時,記住用記憶化,貌似就因為要記憶化才被hdu歸類進dp的。下面是 include in...