vijos p1002 過河(離散化dp)

2021-07-14 07:50:36 字數 1531 閱讀 9923

過河

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點:0,1,……,l(其中l是橋的長度)。座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到t之間的任意正整數(包括s,t)。當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋。

題目給出獨木橋的長度l,青蛙跳躍的距離範圍s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

對於30%的資料,l <= 10000;

對於全部的資料,l <= 10^9。

輸入的第一行有乙個正整數l(1 <= l <= 10^9),表示獨木橋的長度。第二行有三個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數,其中1 <= s <= t <= 10,1 <= m <= 100。第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

輸出只包括乙個整數,表示青蛙過河最少需要踩到的石子數。

10

2 3 5

2 3 5 6 7

2

1s

noip2005 第二題

思路:直接暴力遞推的複雜度太大,會超時和超記憶體。題目中石子個數較小,可以從這裡出發。石子之間有間隔而且大時就會出現連續的跳過相同的石子數的情況。因此我們可以離散化連續相同的石子數。我們可以以相同值段把道路分成<=m+1段。這裡可以想到的話就可以寫出來了。複雜度o(mt^2) 。

其中s==t的時候比較特殊,沒有那麼連續相同片段出現了。而且題中石子位置不是有序,因此需要排一下序。

由於從0為起點,我就把0位置放了個石子,因此最後要減一。  

詳細見**:

#include#include#include#includeusing namespace std;

int dp[200];

int a[110];

int main()

for(i=0;i<=m;i++)

else if(dp[j]==-1&&i+k<=m&&a+j==a[i+k]) k++;

else if(dp[j]!=-1)

}if(a+j>=n&&dp[j]!=-1)

if(ans==-1) ans=dp[j];

else ans=min(ans,dp[j]);

if(j>0&&dp[j]==dp[j-1]) sum++;

else sum=0;

if(sum>t) break;

j++;

} if(k!=0) i+=k-1;

a=dp[j];

memset(dp,-1,sizeof dp);

for(v=0;v<=t-1;v++) dp[v]=a;

//cout<

Vijos p1002 過河 離散化距離 區間DP

題意 一條長度為l l 1e9 的橋上有n 1 n 100 顆石頭。橋的起點為0終點為l.乙隻青蛙從0開始跳,每次跳的長度在s,t 1 s t 10 之間。問青蛙過河最少踩到的石頭的數量?思路 區間dp的感覺很強烈。但是範圍實在是太大了。並且有一種感覺就是當兩顆相鄰的石頭之間的距離相距很遠時,其中間...

洛谷 P1052 過河 dp 離散化

在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為ll的點表示橋的終點。青蛙從橋的...

洛谷 P1052 過河 離散化 DP

題目 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從...