奶牛們打算通過鍛鍊來培養自己的運動細胞,作為其中的一員,貝茜選擇的運動方式是每天進行n(1 <= n <= 10,000)分鐘的晨跑。在每分鐘的開始,貝茜會選擇下一分鐘是用來跑步還是休息。
貝茜的體力限制了她跑步的距離。更具體地,如果貝茜選擇在第i分鐘內跑步,她可以在這一分鐘內跑d_i(1 <= d_i <= 1,000)公尺,並且她的疲勞度會增加1。不過,無論何時貝茜的疲勞度都不能超過m(1 <= m <= 500)。如果貝茜選擇休息,那麼她的疲勞度就會每分鐘減少1,但她必須休息到疲勞度恢復到0為止。在疲勞度為0時休息的話,疲勞度不會再變動。晨跑開始時,貝茜的疲勞度為0。
還有,在n分鐘的鍛鍊結束時,貝茜的疲勞度也必須恢復到0,否則她將沒有足夠的精力來對付這一整天中剩下的事情。
請你計算一下,貝茜最多能跑多少公尺。
第1行: 2個用空格隔開的整數:n 和 m
第2..n+1行: 第i+1為1個整數:d_i
輸出1個整數,表示在滿足所有限制條件的情況下,貝茜能跑的最大距離
5 2534
210貝茜在第1分鐘內選擇跑步(跑了5公尺),在第2分鐘內休息,在第3分鐘內跑步(跑了4公尺),剩餘的時間都用來休息。因為在晨跑結束時貝茜的疲勞度必須為0,所以她不能在第5分鐘內選擇跑步
看出來是個動態規劃應該還是很簡單的吧......
設\(f[i][j]\)表示當前在第i分鐘,疲勞數為j時最長的距離。在每一分鐘,我們有兩種決策,一是往前跑,一是休息。直接翻譯題目意思,我們有如下狀態轉移方程:
\[f[i][j]=max(f[i-1][j-1]+d[i],f[i][j])\\
f[i+j][0]=max(f[i+j][0],f[i][j]),i+j<=n
\]特別地,我們有
\[f[i][0]=max(f[i][0],f[i-1][0])
\]
#include #include #include using namespace std;
int n,m,i,j,d[10002],f[10002][502];
int read()
return w;
}int main()
} cout
}
題解 洛谷P1806 跑步
有趣的水題 只有這麼幾篇題解,那就發一篇吧 這道題我講兩種方法 動規和打表!先講講有趣的打表吧!打表有什麼好說的嗎?有,記得開long long!還是直接上 吧!includeusing namespace std intn long long ans 501 intmain view code 想...
洛谷 P1600 天天愛跑步
題面就不貼上了 把每個玩家的路徑拆成一條到lca的路徑和從lca到終點的路徑 然後,使用樹上差分統計答案即可 那麼,樹上差分是什麼?差分的具體思想是,當某區間內某元素對答案有貢獻,就在區間起點打乙個 1 標記代表多出了乙個對答案有貢獻的元素,在終點打乙個 1標記代表乙個對答案有貢獻的元素在該位置 結...
洛谷P1600 天天愛跑步
樹上的題有點意思啊 這題我最開始的想法是 固定乙個觀測點i,能觀測到的一定是起點距離 i 為 w i 的點的子集合。問題是這個集合只有一部分的點會經過 i 點,就很煩。於是得換個思路,不放固定乙個跑步的人 x 觀察他對哪些觀察者 i 產生了貢獻。於是我們得到了公式,對於上公升階段的點來說,不妨設 s...