T4:【普及模擬】最小步數(steps.pas/cpp)

難度還好

這裏只講一下T4的做法

題目大意:
從起點到終點有N步,如果 “走” 第K步,將會得到A[K]元錢,A[K]可能爲負數
你也可以花100元錢 “跳過” 當前的這一步,即不會得到A[K]。但是任何時刻身上的錢都必須是非負的。開始時,你身上共有0元。給定數組A,求在能到達終點的情況下最小需要走過 (即不是用100元錢跳過) 的步數。

注意: 最後一步必須走,不能選擇跳過。

看到這題,很容易可以想起曾經做過的黑熊過河等題目。
因爲後面的每一步都取決於曾經的走法結果,所以就更確定這題使用DP來做了。

My train to thought (我的思路)

首先這道題一共有兩種走法:

  1. run
  2. jump

所以就可以定義一個f[][][]數組;意思是什麼呢 ?

f[i][j][0]表示從0格走到 i 格用 j 步後下一次跳剩餘的錢數

f[i][j][1]表示從0格走到 i 格用 j 步後下一次走剩餘的錢數

這樣就很快的推出公式:

f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1])-100;
f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j-1][1])+a[i];

當然,各自還需要判斷一下:

if(max(f[i-1][j][0],f[i-1][j][1])-100>=0&&i!=n)......//花費後還能撐住否?i==n否?
if(max(f[i-1][j-1][0],f[i-1][j-1][1])+a[i]>=0)...... //如果a[i]是負數有可能跳不了

最後搜索f [n] [1~n] [0~1]哪個成立 (非負的那個數是剩餘錢數)

所以還有最重要的:
f[][][]數組一開始要全部定義爲負數

解析到此,有神馬不會的可以私聊我哦

. . . . . . . . . . . . . . . . . . . . . . E N D . . . . . . . . . . . . . . . . . . . . . .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章