動態規劃特訓 貝茜的晨練(多狀態轉移)

2021-08-25 17:13:05 字數 1063 閱讀 3172

解題思路:影響最終跑多少公尺的是分鐘和疲勞度這兩個參量,很明顯,這是乙個二維dp的狀態轉化問題。dp[i][j]記錄該狀態下能跑的最大公尺數,其中i表示第i分鐘,j表示疲勞度數。注意邊界條件,設定dp[n+1][j]為負無窮,dp[n+1][0]為0,表示第n+1秒疲勞度必須為0時整個狀態值才為0,只有這個是我們需要的狀態。否則為負無窮,在中間比較的過程中會被丟棄。具體的狀態轉移方程見**。

題目描述:

奶牛們打算通過鍛鍊來培養自己的運動細胞,作為其中的一員,貝茜選擇的運動方式是每天進行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行: 輸出1個整數,表示在滿足所有限制條件的情況下,貝茜能跑的最大 距離

樣例輸入

5 253

4210

樣例輸出

9
#include#include#include#includeusing namespace std;

#define inf 1<<30

int n,m;

int d[10001];

int dp[10001][501];

int main()

for(int i=0;i<=m;i++)

dp[n+1][0]=0;

for(int i=n;i>=0;i--)

}cout<} return 0;

}

USACO 貝茜的晨練計畫

題目 奶牛們打算通過鍛鍊來培養自己的運動細胞,作為其中的一員,貝茜選擇的運動方式是每天進行n 1 n 10,000 分鐘的晨跑。在每分鐘的開始,貝茜會選擇下一分鐘是用來跑步還是休息。貝茜的體力限制了她跑步的距離。更具體地,如果貝茜選擇在第i分鐘內跑步,她可以在這一分鐘內跑d i 1 d i 1,00...

u025 貝茜的晨練計畫

time limit 1 second memory limit 128 mb 奶牛們打算通過鍛鍊來培養自己的運動細胞,作為其中的一員,貝茜選擇的運動方式是每天進行n 1 n 10,000 分鐘的晨跑。在每分鐘的開始,貝茜會選擇下一分鐘是用來跑步還是休息。貝茜的體力限制了她跑步的距離。更具體地,如果...

最優配對問題(集合上的動態規劃) 狀壓DP

題意 給出n個點的空間座標 n為偶數,n 20 把他們配成n 2對,問 怎樣配對才能使點對的距離和最小?題解 設dp s 為 狀態為s s代表著某個子集 時,它的最小距離和。1.對於乙個狀態s,首先要計算它減少兩個點後的狀態的最小距離和,然後當前狀態才能從這些狀態中轉移過來。2.如何轉移 對於狀態s...