每日演算法 動規高頻題 3

2021-10-06 14:24:54 字數 1041 閱讀 9837

1 <= target(目標位置) <= 10000

啊那個r僅僅是轉向還有剎車的意思,並不一樣要後開乙個位置,俺就是看著結果莫名其妙的。

能夠直接到達的位置是2n -1這種型別的位置,如果無法到達就有兩種清空。

1.開過了,得倒回來,這種情況比較簡單,只需加上開到過了的那個位置的運算元(n)+開回來的次數(2n-1-x時的運算元)+掉頭的操作。

2.開到前乙個正好(2n-1-1)時就麻煩了,2n-1 ~x的位置也是個套娃結構,這裡停了一下,這時速度降為0了,然後開到下乙個位置,可是有時候開一下頓一下(速度降為0)比後面掉頭的次數會少一些,所以只能乙個乙個的恰好位置的嘗試。所以這種情況總的時間就是 n-1+剎車+前進到某個恰好位置(j)+掉頭或者剎車+前進到剩餘的步數的運算元(i-(2n-1-1)+2j-1).

可以看到問題就是開到最接近的乙個恰好位置(最接近目標的左右兩個2的冪次方-1)時下一步怎麼選最大,而之後的又是在更小的範圍,同樣的規則,應該做何選擇。這就出現了子問題。

定義:

dp[i]:開到i位置時所需要的運算元。

轉移方程:

dp[i] =

剛好: dp[i] =n.

開過了:dp[i] = n+1+dp[2n-1-i];

還差點: dp[i] = n-1+1+dp[i-(2n-1-1)+2j-1]+1+j.

選擇最小那個就是了(當然如果可以的話剛好那個肯定是最小的),j是可供選擇的轉移狀態。

class

solution

for(

int j=

0;j1;j++

) dp[i]

= math.

min(dp[i]

,dp[tmp-i]

+bit+1)

;}return dp[target];}

}

複習動規(3)

繼續複習動規。第一道,scoi2010 交易。看起來限制多,其實就是紙老虎。可設f i j 指第i天擁有j張 所賺的最大錢數,所以f i j 可為負,所以初值設為 inf。四種情況 1.什麼都不買,f i j max 2.第一次買,f i j max 0 j asi 3.之後的買,f i j max...

區間動規經典題 石子合併

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分 試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別表示每堆石...

區間動規經典題 石子合併

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分 試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別表示每堆石...