DP 狀態壓縮 洛谷 P1052 過河

2021-08-15 14:29:30 字數 2411 閱讀 4851

題目描述

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

1,……,

l(其中

l是橋的長度)。座標為

0的點表示橋的起點,座標為

l的點表示橋的終點。青蛙從橋的起點開始,不停的向終點方向跳躍。一次跳躍的距離是s到

t之間的任意正整數(包括

s,t)。當青蛙跳到或跳過座標為

l的點時,就算青蛙已經跳出了獨木橋。

題目給出獨木橋的長度

l,青蛙跳躍的距離範圍

s,t,橋上石子的位置。你的任務是確定青蛙要想過河,最少需要踩到的石子數。

輸入輸出格式

輸入格式:

輸入檔案

river.in

的第一行有乙個正整數l(

1 <= l <= 10^9

),表示獨木橋的長度。第二行有三個正整數s,

t,m,分別表示青蛙一次跳躍的最小距離,最大距離,及橋上石子的個數,其中

1 <= s <=t <= 10

,1 <= m <= 100

。第三行有

m個不同的正整數分別表示這

m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

輸出格式:

輸出檔案

river.out

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

輸入輸出樣例

輸入樣例

#1:

複製10

2 3 5

2 3 5 6 7

輸出樣例

#1:複製2

說明

對於30%

的資料,

l \le 10000

l≤10000

;對於全部的資料,

l \le 10^9

l≤109。

2005

提高組第二題

題目分析:

dp 很容易,但狀態壓縮乙個我剛剛聽說的名詞確實很無語。

它說:l<=10的9次方,而石頭總數總共100顆,也就是說在一億公尺上放100顆石頭肯定是很稀鬆的,所以我們可以在兩個石頭之間壓縮距離。

第一種方法:

假如我們現在在乙個位置i,要到j位置,我們只要保證倆位置距離》=s*t即可,

那我們把中間複雜的距離除去,具體除去看**。

注意特殊情況:當s=t時,只需考查石子是否是s的倍數即可。這種情況單獨考查。

**實現:

#includeusing namespace std;

int f[20000];

int a[101],d[101],stone[300001];

int main()

sort(a+1,a+m+1); //記得排序啊

if(s==t)

stone[a[m+1]]=0 ; //橋尾不是石子,上面迴圈到m+1是為了把橋尾平移

for(i=1;i<=a[m+1]+t;i++)

f[i]=m;

for(i=1;i<=a[m+1]+t;i++) //這裡是可以跳出去的

for(j=s;j<=t;j++)

int minn=m;

for(i=a[m+1];i<=a[m+1]+t;i++)

cout<第二種方法:

以為它的步數在1~10之間,所以我們直接對1~10的最小公倍數取模,效果也是一樣的。

**實現:

#include#includeusing namespace std;

int a[105],d[105],stone[350000];

int f[350000];

int main()

l=a[m]; //壓縮路徑後的總長度

for (int i=0;i<=l+t;i++) f[i]=m; //f[i]表示到位置i最少能踩到的石子數

f[0]=0;

//以上是初始化,接下來是動歸

for (int i=1;i<=l+t;i++)

for (int j=s;j<=t;j++)

int ans=m;

for (int i=l;icout

}

洛谷 P1052 過河 DP 路徑壓縮

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

洛谷P1052 過河 dp

題目大意 獨木橋長度l,橋上有m個石頭,要過橋,起點0,只要跳到或者跳過l都算過了,每次跳躍距離是s t之間的整數值,問跳過橋最少需要踩到的石子數 dp i 表示跳躍了距離i,最少需要踩到的石子數。stone i 表示在距離i有無石頭。狀態轉移方程 dp i min dp i dp i j ston...

洛谷P1052 過河(dp)

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