Poj3208 啟示錄 數字統計 DP

2022-04-28 20:06:17 字數 2439 閱讀 1381

這題長得就比較像數字$dp$叭.

所以先用$dp$進行預處理,再基於拼湊思想,通過"試填法"求出最終的答案.

設$f[i][3]$表示由$i$位數字構成的魔鬼數有多少個,$f[i][j](0<=j<=2)$表示由$i$位數字組成的,開頭有$j$個$6$的非魔鬼數有多少個.注意,在計算$f[i][j]$時允許前導$0$的存在

$f[i][0]=9*(f[i-1][0]+f[i-1][1]+f[i-1][2])$

$f[i][1]=f[i-1][0]$

$f[i][2]=f[i-1][1]$

$f[i][3]=f[i-1][2]+10*f[i-1][3]$

預處理完成之後,我們先通過$f[i][3]$確定第$x$小魔鬼數的位數,然後從左到右進行試填,試填的數從小到大列舉

這題長得就比較像數字$dp$叭.

所以先用$dp$進行預處理,再基於拼湊思想,通過"試填法"求出最終的答案.

設$f[i][3]$表示由$i$位數字構成的魔鬼數有多少個,$f[i][j](0<=j<=2)$表示由$i$位數字組成的,開頭有$j$個$6$的非魔鬼數有多少個.注意,在計算$f[i][j]$時允許前導$0$的存在

$f[i][0]=9*(f[i-1][0]+f[i-1][1]+f[i-1][2])$

$f[i][1]=f[i-1][0]$

$f[i][2]=f[i-1][1]$

$f[i][3]=f[i-1][2]+10*f[i-1][3]$

預處理完成之後,我們先通過$f[i][3]$確定第$x$小魔鬼數的位數,然後從左到右進行試填,試填的數從小到大列舉

code

#include#include

#include

#define rg register

#define il inline

#define db double

#define ll long long

#define go(i,a,b) for(rg int i=a;i<=b;i++)

#define yes(i,a,b) for(rg int i=a;i>=b;i--)

using

namespace

std;

il int

read()

while(c>='

0'&&c<='9')

return x*y;

}int

t,n,d,k;

ll f[

21][4

];il

void

init()

}int

main()}}

printf("\n

");}

return0;

}

view code

數字DP POJ 3208 啟示錄

題目大意 我們稱只要某數字的十進位制表示中有三個連續的6,我們就稱它為 魔鬼數 比如 666,1666,6663,16666 等。現給出乙個數x,求 第x小的魔鬼數 x 5 107 x le 5 times 10 7 x 5 10 7,一共有t組資料點,t 1000 t le1000 t 1000 ...

遊戲啟示錄

暑假期間因為比較清閒,玩了很多遊戲。有些是近幾年的新遊戲,有些是古老的遊戲。自己在玩遊戲的過程中也總結出一些遊戲設計上的心得。下面一一介紹 1.魔法師傳奇。這個遊戲最近幾年出了第2部。可惜不知道是什麼原因,畫面是跳動的,而且進入遊戲後動滑鼠就宕機。無奈只得將其刪除。它是由曾經開發過 幽浮 的英國著名...

「摩根」啟示錄

摩根 啟示錄 1 摩根 公司創立 摩根 公司創立於2006年4月1日的一次 戰略管理與決策 沙盤模擬訓練。非常感謝公司給我們這樣一次全面體驗企業經營的機會。1.1沙盤模擬 沙盤模擬訓練源自西方軍事上的戰爭沙盤模擬推演,完全不同於傳統的灌輸授課方式,它通過模擬企業執行,使受訓者在主導 企業 各項經營管...