51Nod1623 完美消除

2022-05-08 19:27:11 字數 1067 閱讀 7617

link

$solution:$

首先我們可以發現乙個結論,對於乙個數 $x$ ,它的最低修改次數為它每位與前去中是否都比此位上的數大,有則答案 $-1$ 。因為若有小數則沒有辦法將其答案貢獻變低。

這個東西可以直接單調棧維護乙個遞增序列。

所以這樣 $dp$ 狀態也很顯然了,設 $f_$ 表示當前到 $i$ 位,答案為 $j$ ,$sta$ 表示當前棧中 $0-9$ 是否在棧中。

簡單數字轉移即可。

時間複雜度 $o(10\times 18^2 \times 2^)$ 。

#include#include

#include

#include

#define int long longinline

intread()

while(c>='

0'&&c<='9')

return f*ans;

}const

int maxn=21

;int dig[11],f[maxn][maxn][1

<<10

];int

l,r,k,cnt;

void debug(int

sta)

for(int i=dig[0];i>=1;i--) printf("

%d ",dig[i]);printf("\n"

);

return;}

int dfs(int ps,int k,int sta,int

done)

int end,ans=0

;

if(done) end=dig[ps];

else end=9

;

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

if(done==0) f[ps][k][sta]=ans;

return

ans;

}int solve(int

x)

return dfs(dig[0],0,1,1);}

signed main()

view code

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

首先考慮一下給乙個數如何求它需要多少次操作。顯然用乙個單調棧就可以完成 塞入棧中,將比它大的所有數都彈出,如果棧中沒有當前數,答案 1。因為數的範圍只有0 9,所以我們可以用乙個二進位制數來模擬這個棧,並塞到dp的狀態裡。設 dp i j k 表示前i位數,已經進行了j次操作,棧的狀態為k的方案數。...

51Nod 1780 完美序列

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

51Nod1367 完美森林 貪心

有一棵n個點的樹,樹中節點標號依次為0,1,2,n 1,其中n 500000。樹中有n 1條邊,這些邊長度不一定相同。現在要把樹中一些邊刪除,設刪除了k條邊 k 0,即可以不刪除任何邊 由樹的性質可知,該樹將被分割為乙個含有k 1棵樹的森林。稱乙個森林是 完美森林 要求這個森林中的每一棵樹滿足 該樹...