傳送門^o^
只看題目描述 你會發現這是一道非常簡單的 dp 題但是 資料範圍是l≤109 啊
30分解:就是很簡單的啊1 #include2 #include3 #include430分 view code#define go(i,a,b) for(register int i=a;i<=b;i++)
5#define yes(i,a,b) for(register int i=a;i>=b;i--)
6#define mem(a,b) memset(a,b,sizeof(a));
7#define ll long long
8#define db double
9using
namespace
std;
10int
read()
1114
while(c>='
0'&&c<='
9')
15return x*y;16}
17int
l,s,m,t;
18 ll ans,dp[300000
];19
bool f[300000
];20
intmain()
2132
if(i>=l) ans=min(ans,dp[i]);33}
34 printf("
%lld
",ans);
35return0;
36 }
再講一下我自己想的方法(但是寫了好久**也寫不對qwq):前面的方法中 for(j,s,t) dp[i]=min(dp[i],dp[i-j]) (如果i處有石頭就再+1)
發現要求dp[i] 只要知道dp[i-t]~dp[i-s] 即可 前面的都對現在沒有影響
s,t<=10 範圍非常小就可以不要開之前的dp陣列了
又發現只要求 min(dp[i-t]~dp[i-s])
好像滑動視窗啊!!!
為了方便還可以用deque和queue
我覺得我說的好有道理啊 但是我寫不對qwq
$upd\ on\ 11.2:$我以前在想啥?這樣顯然過不了吖$qwq$
我看懂的題解
:我們發現不能直接像之前30分的做法那樣dp
是因為l實在是太大了 開不了那麼大的陣列
所以我們就想能不能把l變得小一點
如圖 顯然灰色箭頭是可以走得到的地方(第i步走的最近和走的最遠之間的)
起初還有灰色箭頭覆蓋不到的地方
但是我們可以發現當紅色點和藍色點重合之後 灰色箭頭一定可以覆蓋到後面的每乙個點
而重合點即為s和t的最小公倍數lcm
當兩塊石頭之間的間隔大於lcm時 直接把它壓縮成lcm
但是要注意一種特殊的情況 就是當s==t時 特判即可
code
1 #include2 #include3 #include4 #include5view code#define go(i,a,b) for(register int i=a;i<=b;i++)
6#define mem(a,b) memset(a,b,sizeof(a));
7#define m 90*100+10
8#define n 100+10
9using
namespace
std;
10int
read()
1114
while(c>='
0'&&c<='
9')
15return x*y;16}
17int
l,s,m,t,ans,a[n],b[n],dp[m];
18bool
f[m];
19int
main()
2031 go(i,1
,m)32
37 l=b[m]+t*s;
38 go(i,1
,l)39
45if(i>=b[m]) ans=min(ans,dp[i]);46}
47 printf("%d"
,ans);
48return0;
49 }
至此 洛谷普及訓練場所有dp專題都通關啦(當然不是都完成了qwq)^o^ 然後現在要去回顧一下原來寫過的dp題
洛谷 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的情況...
洛谷 P1052 過河
在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的點表示橋的終點。青蛙從橋的起...