洛谷P1052 過河 dp

2021-08-20 03:14:13 字數 992 閱讀 1043

題目大意:獨木橋長度l,橋上有m個石頭,要過橋,起點0,只要跳到或者跳過l都算過了,每次跳躍距離是s~t之間的整數值,問跳過橋最少需要踩到的石子數

dp[i]表示跳躍了距離i,最少需要踩到的石子數。

stone[i]表示在距離i有無石頭。

狀態轉移方程:dp[i] = min(dp[i], dp[i-j]+stone[i]);

可是l <= 1e9, 太大了。。。爆陣列的節奏,所以將距離壓縮處理

!!!壓縮處理:因為跳躍的距離是s~t之間的整數值,即最多條t那麼兩個石塊之間的距離有若干個t就沒意義了。則兩塊石頭之間的距離dis就可以壓縮為dis = dis % t + t;

#include 

#include

#include

using

namespace

std;

const

int maxn = 20010;//(2 * t)* m

const

int inf = 2147483640;

int dp[maxn], stone[maxn];//壓縮處理並記錄該處有無石頭bool值

int a[110];//記錄第i塊石頭的位置

int main()

stone[dis] = 0;//dis最後是壓縮後l的對映值

dp[0] = 0;

for(i = 1; i <= dis + t - 1; ++i)

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

if(i - j >= 0)

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

int ans = inf;

for(i = dis; i <= dis + t - 1; ++i)

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

printf("%d\n", ans);

return

0;}

洛谷P1052 過河(dp)

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

洛谷 P1052 過河

題目 過河 思路 因為l的值太大,而實際有石子的地方卻並不多,所以要先進行離散化。即將每個石子之間的差距都控制在剛好比t大一點的位置,這樣就不會影響最終結果。令f i 表示跳過前i個位置需要最少踩得石頭數量,轉移方程f i min f i j cnt i f i j s,t 注意最後的輸出是min,...

洛谷 P1052過河

這個是題幹 這是一道noip2005年的提高組的題,那道題一看,就是要用動態規劃,狀態轉移方程也十分簡單。只需要考慮是從哪個地方來的,看看即將到達的點是否有石子。用一維陣列 f x 表示第x位的步數 額,這只是30分的寫法,l 的取值太大,陣列承受不了 之後,我又想騙一點分,就特判了一下s t的情況...