奶牛的鍛鍊 線性dp

2021-07-15 11:47:12 字數 1094 閱讀 8616

奶牛bessie有n分鐘時間跑步,每分鐘她可以跑步或者休息。若她在第i分鐘跑步,可以跑出d_i公尺,同時疲倦程度增加1(初始為0)。若她在第i分鐘休息,則疲倦程度減少1。無論何時,疲倦程度都不能超過m。另外,一旦她開始休息,只有當疲憊程度減為0時才能重新開始跑步。在第n分鐘後,她的疲倦程度必須為0。

第一行,兩個整數,代表n和m。 接下來n行,每行乙個整數,代表d_i。

n <= 10000 , m <= 500 , d_i <= 1000

bessie想知道,她最多能跑的距離。

5 2 5

3 4

2 10

9第i秒可以選擇走或者休息,如果走,就需要第i-1秒疲勞值不滿,這時候第i秒的長度就是第i-1秒的值加上能走的長度,但不滿有0~m-1種可能,這時候需要選擇第i-1秒時候,疲勞值為0~m-1中長度最長的那個。保證子問題最優。如果休息,第i秒的最大長度只能等於休息前的長度。休息的話,還有一是休息0~m-1種可能秒,從裡面找乙個最大maxn的;二是一直疲勞值為零了還休息。這種情況得到的值和上一情況的maxn比較取最大。

**

#include#includeusing namespace std;

int f[10010][510],a[10010];//第i秒疲勞值為j時走的最大路程。

int main()

{ int n,m,i,j,k;

scanf("%d%d",&n,&m);

for(i=1;i<=n;++i)

scanf("%d",&a[i]);

for(i=1;i<=n;++i)

{//選擇跑

for(j=0; j<=m&&j<=i; ++j)//j<=i疲勞值不可能超過一直跑所獲得的疲勞,最長不下降子串行也是要在當前位置之前去找最大

{f[i][j]=max(f[i][j],f[i-1][j-1]+a[i]);

//上面這句話是迴圈找上一秒各個不同疲勞時的最大值,模擬於最長不下降子串行,就是找之前比他數值小的中最長的乙個

//實際上等於

//if(f[i][j]

DP練習 奶牛的鍛鍊

奶牛bessie有n分鐘時間跑步,每分鐘她可以跑步或者休息。若她在第i分鐘跑步,可以跑出d i公尺,同時疲倦程度增加1 初始為0 若她在第i分鐘休息,則疲倦程度減少1。無論何時,疲倦程度都不能超過m。另外,一旦她開始休息,只有當疲憊程度減為0時才能重新開始跑步。在第n分鐘後,她的疲倦程度必須為0。第...

奶牛的鍛鍊

這題有一點比較猥瑣,就是一休息就要休息到疲勞值為0 奶牛果然沒有人類勤奮啊 辣麼如果不讓奶牛休息,這題是不是好解的多呢?任何乙個蒟蒻都可以看出,f i j f i 1 j 1 d i 現在加入了休息也很好辦,一休息就去替換f 0 而不參加迴圈部分的運算,這樣可以減去一些負擔。於是我們可以寫出偽 f ...

Tyvj 題目1023 奶牛的鍛鍊(DP)

p1023奶牛的鍛鍊 usaco 奶牛bessie有n分鐘時間跑步,每分鐘她可以跑步或者休息。若她在第i分鐘跑步,可以跑出d i公尺,同時疲倦程度增加1 初始為0 若她在第i分鐘休息,則疲倦程度減少1。無論何時,疲倦程度都不能超過m。另外,一旦她開始休息,只有當疲憊程度減為0時才能重新開始跑步。在第...