演算法涉及:dp + 離散化
\(l\) 的範圍太大,無法作為陣列下標,所以先離散化,再dp。兩點間的距離d大於t時,一定可以由 \(d\ \%\ t\) 跳過來,所以最多隻需要t+d%t種距離的狀態就可以表示這兩個石子之間的任意距離關係。這樣就把題目中的 \(10^9\) 壓縮成了\(2*t*m\) 最多不超過 \(2000\) ,然後就可以放心大膽地用dp了。不過要注意題目中的「當青蛙跳到或跳過座標為l的點時,就算青蛙已經跳出了獨木橋」,所以dp的終點是乙個範圍而非確切的乙個點,最後還要在這個範圍內取最小值。
using ll = long long;
const int n = 1e6 + 10;
const ll inf = 0x3f3f3f3f;
ll dp[n], a[n], vis[n];
void solve()
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for (int i = 1; i <= tmp + 100; ++i)
for (int j = s; j <= t; ++j)
if (i >= j)dp[i] = min(dp[i], dp[i - j] + vis[i]);
ll ans = inf;
//終點可能的範圍,稍微寫大點·
for (int i = tmp; i <= tmp + 100; ++i)
ans = min(ans, dp[i]);
cout << ans;
}
vijos p1002 過河(離散化dp)
過河 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從...
每日一題 NC17137 DP
nc17137 思路 dp狀態定義為dp i j 表示前i個數刪除j個後的答案。那麼很容易得到遞推方程 dp i j dp i 1 j 1 dp i 1 j 就是刪除當前這個和不刪除當前這個的情況,然後如果是 1 2 3 5 6 7 8 5 m 4的話,就會出現刪除5 6 7 8 和刪除6 7 8 ...
每日一題 石子合併 區間DP
區間dp我也不會,哈哈,正好一起學習一下,做一下這道區間dp入門題。區間dp其實也是線性dp的一種,只是由於其實在太規律,所以分成一類以方便學習!要點 狀態必然包含區間是哪個 i,j 通過列舉區間分界點進行轉移。也就是說乙個大區間是由兩個子區間合併來的或者是兩個子區間加上中間元素合併來的!在合併 的...