有個牛,好多題了,都是牛。然后她想吃蘋果。有兩個樹,單位時間,在一棵樹上會掉下來一個蘋果。她必須在這個時間正好站到了這棵樹下,才能吃到這個蘋果?,F在給你一共有T(1000)個單位時間,以及每個單位時間是哪一顆樹上要掉蘋果,這個??梢运查g從一棵樹到達另一棵樹下面,但是這種瞬移技能只能釋放最多w(30)次 。問你這個牛最多可以吃到多少蘋果。(注:牛一開始在1號樹下)ps:要是問西瓜就好了,因為西瓜不長在樹上····
思路:
設a[i][j][k]表示這個牛在第i個蘋果掉下來時,在j號樹下,用了k次技能,所能得到的最多的蘋果數。
遞推公式:a[i][j][k]=max(a[i-1][j][k],a[i-1][!j][k-1]); if(v[i]==j)a[i][j][k]++;邊界條件:a[1][j][k];a[i][j][0];
關于遞推公式以及邊界條件的解釋:
這個牛在第i個蘋果掉下來的時候,在第j號樹下,用了k次技能。能得到這個狀態的上一狀態為:這個牛在第i-1個蘋果掉下來的時候,在第!j號樹下,用了k-1次技能;或者這個牛在第i-1個蘋果掉下來的時候,在第j號樹下,用了k次技能。(關鍵也就是這個牛在第i-1個蘋果掉下來和第i個蘋果掉下來之間,有沒有使用技能)然后如果,這個蘋果他接到了,就+1唄~
然后是關于邊界條件,很適合想想一個三維的表格來儲存數組a(雖然想畫個三維圖,但是用筆畫的圖爛的掉渣,估計大家也看不清,就自己想象吧),這樣的話,如果要推出第i層的一個,就需要知道第i-1層的兩個格(沿i軸-1的一個,以及同i-1平面內無相交邊的另一個)。這樣,在i取1的時候,就找不到對應的i-1平面了,所以要確定邊界a[1][j][k];同樣,在k=0時就找不到對應的k-1了,所以也要確定邊界a[i][j][0]。另外十分要注意,開始的時候在1號樹下面,所以一切在2號數下面翻轉0次得到的蘋果數都是-inf。
然后三層循環為什么從外到內的順序為ikj:還是有些疑問,不過目前對于這道題來看,調換ik的內外層關系并沒有發生錯誤。對于三維圖來說,只不過是改變了各個格的數值確定的順序。然后就是對遞推公式理解上就不太好解釋了(其實也是可以解釋的):一個一個的用技能,在第i個格用技能得到的總金額可以根據在第i-1個格用技能(a[i-1][j][k])或者不用這個技能(a[i-1][!j][k-1]) 兩種情況來確定。
新聞熱點
疑難解答