洛谷 P1052 過河 DP 路徑壓縮

2022-05-16 01:29:49 字數 1724 閱讀 2469

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

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

輸入格式:

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

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

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

輸出格式:

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

輸入樣例#1: 複製

10

2 3 5

2 3 5 6 7

輸出樣例#1: 複製

2
對於30%的資料,l≤10000;

對於全部的資料,l≤109。

2005提高組第二題

一開始被題目坑慘了啊...看到題就打了個建邊$spfa$,然後樣例怎麼過不了???

仔細研讀樣例發現是在可以不踩石頭的情況下最少要踩幾個石頭啊!!!

然後重新定義dp方程...發現$s$和$t$是小於等於10的,$l$又莽大。所以考慮如何把空間壓下去。考慮路徑壓縮。

以下貼的洛谷大佬panda_hu的題解:

當然,我覺得還是直接$mod$2520比較好理解...因為在10範圍內,不論怎麼跳,都可以跳到2520,所以只要兩個石頭距離大於2520的時候,直接$mod$2520。

路徑壓縮了過後掃一遍更新即可,如果當前有石頭就必須踩。

#include#include

#include

#include

#include

using

namespace

std;

int l, s, t, m, f[3000005], flag[3000005], d[105

];struct

node stone[

105];

bool cmp ( node a, node b )

intmain ( )

memset ( f,

0x3f3f3f3f, sizeof

( f ) );

f[0] = 0

;

for ( int i = 1; i <= stone[m].pos + t; i ++)

int ans = 0x3f3f3f3f

;

for ( int i = stone[m].pos; i < stone[m].pos + t; i ++)

ans =min ( ans, f[i] );

printf ( "%d

", ans );

return0;

}

洛谷 P1052 過河 壓縮路徑

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

DP 狀態壓縮 洛谷 P1052 過河

題目描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 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...