51nod 1623 完美消除(數字DP)

2022-05-12 15:51:12 字數 684 閱讀 2732

首先考慮一下給乙個數如何求它需要多少次操作。

顯然用乙個單調棧就可以完成:塞入棧中,將比它大的所有數都彈出,如果棧中沒有當前數,答案+1。

因為數的範圍只有0~9,所以我們可以用乙個二進位制數來模擬這個棧,並塞到dp的狀態裡。

設$dp[i][j][k]$表示前i位數,已經進行了j次操作,棧的狀態為k的方案數。

每次列舉乙個數的時候,先把比這個數大的數在狀態中都清零,再

看看狀態中有沒有這個數,沒有的話答案+1。

注意需要把狀態初始值設為0在棧中...t t

#include#include

#include

#include

#define ll long long

using

namespace

std;

ll l, r, k;

ll dp[

20][20][1

<<10

];int a[20

];ll dfs(

int pos, int k, int st, bool

limit)

if(!limit) dp[pos][k][st]=ans;

return

ans;

}ll solve(ll x)

intmain()

view code

51Nod1623 完美消除

link solution 首先我們可以發現乙個結論,對於乙個數 x 它的最低修改次數為它每位與前去中是否都比此位上的數大,有則答案 1 因為若有小數則沒有辦法將其答案貢獻變低。這個東西可以直接單調棧維護乙個遞增序列。所以這樣 dp 狀態也很顯然了,設 f 表示當前到 i 位,答案為 j sta 表...

完美消除(數字dp,單調棧)

原題鏈結 1.對於乙個數的花費,可以把數從高位到地位列舉,利用單調棧。比如當前位為x,把棧裡比x大的全部彈出。然後如果棧裡還有x,則不把x放入,運算元不變。若棧裡沒有x,可以把x放進去,運算元 1。比如323 3進棧 op 1。2來了,把3彈出,2放進去 op 2。3來了,把3放入棧中,op 3 比...

51Nod 1780 完美序列

acm模版 首先,我們先來分析一下如何構造才合法。先預處理出來每種大小的數的個數,並在這個過程進行判斷是否連續 不大於 1 然後,我們可以從小到大進行插空法插數,那麼如何插呢?假如,此時我們已經查到數 i,那麼合法的插孔分為兩種,第一種是插在兩個 i 1 之間,另一種就是當首尾有 i 1 時,我們可...