難度還好
這裏只講一下T4的做法
題目大意:
從起點到終點有N步,如果 “走” 第K步,將會得到A[K]元錢,A[K]可能爲負數。
你也可以花100元錢 “跳過” 當前的這一步,即不會得到A[K]。但是任何時刻身上的錢都必須是非負的。開始時,你身上共有0元。給定數組A,求在能到達終點的情況下最小需要走過 (即不是用100元錢跳過) 的步數。
注意: 最後一步必須走,不能選擇跳過。
看到這題,很容易可以想起曾經做過的黑熊過河等題目。
因爲後面的每一步都取決於曾經的走法結果,所以就更確定這題使用DP來做了。
My train to thought (我的思路)
首先這道題一共有兩種走法:
- run
- 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[][][]數組一開始要全部定義爲負數
解析到此,有神馬不會的可以私聊我哦