寶石獵人 51Nod 1455 記憶化搜尋

2021-08-22 16:31:10 字數 1249 閱讀 7272

蘇塞克島是乙個有著30001個小島的群島,這些小島沿著一條直線均勻間隔分布,從西到東編號為0到30000。眾所周知,這些島上有很多寶石,在蘇塞克島上總共有n顆寶石,並且第i顆寶石位於島 pi上。

小法正好到達0號小島上,他擁有卓越的跳躍能力,能根據以下規則在小島之間向東重複跳躍:

・        首先,他會從0號島跳到d號島

・        此後,他會根據以下規則繼續跳躍,l是上一次跳躍的長度,即,如果他上一次跳躍是從島prev島cur,l= cur-prev。他可以向東做一次長度為l-1,l或l+1的跳躍。即,他將會跳到島 (cur + l - 1), (cur + l) 或 (cur + l + 1)(如果這些島存在)。一次跳躍的長度必須是正數,即,當l=1時,他不能做一次長度為0的跳躍,如果沒有有效的目的地,他將會停止跳躍。

小法將會在跳躍的過程中收集到過的島上的寶石。我們要找到小法能收集的寶石的最大數。

樣例解釋:在第乙個樣例中,最優路徑是 0    →    10 (+1寶石 )    →    19    →    27 (+2寶石 )    →...

input

輸入的第一行是兩個以空格隔開的整數n和d (1 ≤ n, d ≤ 30000),分別表示蘇塞克島上的寶石數量和小法第一次跳躍的長度。 

接下來n行表示這些寶石的位置,第i行(1 ≤ i ≤ n)包含乙個整pi(d ≤ p1 ≤ p2 ≤ 

... ≤ pn ≤ 30000),表示包含第i顆寶石的小島的編號。

output

輸出小法能收集的寶石的最大數

sample input

4 10

1021

2727

sample output

3
為什麼dp陣列開500就夠了,我還是不知道,除錯執行的時候dp[30000][30000]非常正常的繼續執行下去了。

特別狗的是dp在清空的時候清0超時,清-1過了。玄學

#include#include#includeusing namespace std;

#define ll long long

int dp[31005][506];

int a[31005];int ans=0;

int maxn=0;

int dfs(int x,int k)

int main()

} dfs(k,k);

printf("%d\n",ans);

return 0;

}

51nod1455 寶石獵人 DP

蘇塞克島是乙個有著30001個小島的群島,這些小島沿著一條直線均勻間隔分布,從西到東編號為0到30000。眾所周知,這些島上有很多寶石,在蘇塞克島上總共有n顆寶石,並且第i顆寶石位於島 pi上。小法正好到達0號小島上,他擁有卓越的跳躍能力,能根據以下規則在小島之間向東重複跳躍 首先,他會從0號島跳到...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...