最小步數(4 8 jzoj 第二題)

2021-07-30 06:25:47 字數 1301 閱讀 9528

題目:

description

從起點到終點有n步,如果「走」第k步,將會得到a[k]元錢,a[k]可能為負數。

你也可以花100元錢「跳過」當前的這一步,即不會得到a[k]。但是任何時刻身上的錢都必須是非負的。開始時,你身上共有0元。給定陣列a,求在能到達終點的情況下最小需要走過(即不是用100元錢跳過)的步數。注意:最後一步必須走,不能選擇跳過。

input

共有兩行。

第一行為整數n(0<=n<=100)。

第二行有n個整數,第k個數為a[k],-10000<=a[k]<=10000,。

output

乙個整數,表示需要走的最少步數。若無法走到終點,輸出-1。

sample input

6 30 30 30 30 30 30

sample output

作者思路:乙個記憶化搜尋。

**:

var n,i,m,j:longint;

f:array[0..101,0..101] of longint;

a:array[0..101] of longint;

procedure

dfs(i,mon,sum:longint);

begin

if sum>=m then

exit;

if i=n then

begin

if (mon+a[i]>=0)and(sum+1

then m:=sum+1;

exit;

end;

if sum+1>=m then

exit;

if f[i,sum]>=mon then

exit

else f[i,sum]:=mon;

if f[i,sum]+a[i]>=0

then dfs(i+1,mon+a[i],sum+1);

if f[i,sum]>=100

then dfs(i+1,mon-100,sum);

end;

begin

read(n);

for i:=0

to n do

for j:=0

to n do f[i,j]:=-1;

for i:=1

to n do

read(a[i]);

m:=maxlongint;

dfs(1,0,0);

if m<>maxlongint then

write(m) else

write(-1);

end.

第二題 兩數相加

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

JZOJ 7 9C組第二題 騎士問題

給出乙個8 8的棋盤,上面有一些障礙物,我們知道騎士是走l形的,現在給出騎士的座標和終點座標,求出騎士能到達的最少步數,如果不能到達就輸出not reachable。就是乙個簡單的bfs模板題,注意細節就好了。include include using namespace std int ans,h...

Leetcode 第二題 兩數相加

給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 ...