洛谷P1052 過河(dp 狀壓)

2021-08-29 10:13:40 字數 1553 閱讀 3976

題目鏈結

題目描述

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

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

輸入輸出格式

輸入格式:

第一行有1個正整數l(1≤l≤10^9),表示獨木橋的長度。

第二行有3個正整數s,t,m,分別表示青蛙一次跳躍的最小距離,最大距離及橋上石子的個數,其中1≤s≤t≤10,1≤m≤100。

第三行有m個不同的正整數分別表示這m個石子在數軸上的位置(資料保證橋的起點和終點處沒有石子)。所有相鄰的整數之間用乙個空格隔開。

輸出格式:

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

dp[i]=min(dp[i],dp[i-j]+stone[i]);

到達距離i時,上一步跳了j的距離

關鍵在於狀壓

t<=10,所以%t*(t-1)=%90;

#include

#include

#include

#include

using

namespace std;

int l,s,t,n,a[

105]

;int ans;

int dp[

1100000

],stone[

1100000];

intmain()

sort

(a+1

,a+n+1)

;if(s==t)

cout

}// sum=(t-1)*t;

for(

int i=

1;i<=n;i++

) l=

(l-a[n])%

90+a[n]

;// l=(l-a[n])%sum+a[n];

for(

int i=

1;i<=n;i++

)memset

(dp,

0x3f3f3f

,sizeof

(dp));

dp[0]

=0;for

(int i=s;i<=l+t;i++

)for

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

) ans=

105;

for(

int i=l;i<=l+t;i++

) cout

}/*void dfs(int now,int sum)

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

if(now+i!=a[i])

}}*/

洛谷P1052 過河 狀壓dp

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

洛谷 P1052 過河(狀壓dp)

題意 在一條長為 l l 的獨木橋上有很多石子 座標為 mi role presentation style position relative mim i有乙隻青蛙要從座標零點跳到 l l 處或者跳過 l role presentation style position relative l l,...

洛谷P1052 過河 dp

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