CFF 有趣的數 詳解

2021-07-24 14:22:59 字數 1660 閱讀 9552

我們把乙個數稱為有趣的,當且僅當:

1. 它的數字只包含0, 1, 2, 3,且這四個數字都出現過至少一次。

2. 所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。

3. 最高位數字不為0。

因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個:2031和2301。

請計算恰好有n位的有趣的數的個數。由於答案可能非常大,只需要輸出答案除以1000000007的餘數。

輸入格式

輸入只有一行,包括恰好乙個正整數n (4 ≤ n ≤ 1000)。

輸出格式

輸出只有一行,包括恰好n 位的整數中有趣的數的個數除以1000000007的餘數。

樣例輸入

4 樣例輸出

3因為數字只包含0,1,2,3,且0必然在1前,2必然在3前,然而0不可能在第一位,所以只有2出現在第一位。然後其他狀態都是有該狀態衍生出來的狀態。

下邊我們按照下圖分析

a,按照規則,2後邊可以跟3或者0,因為0還未出現,所以不可以

為1.b, 02狀態可以由2狀態新增0到達,也可以由02狀態,新增0或2到達。

因為0,2沒有關係。可以存在以下兩種情況。比如數字 222000,或22022

c,23狀態可以由2狀態新增3到達,也可以有23新增3到達。因為3必須在2之後,所以只能新增3。比如數字22333,或者2233333.

d,012可以有02狀態新增1到達。也可以由012新增1或2到達。

e,023可以由02新增3到達,亦可由23新增0到達。亦可由023到達。

f,0123可以由012新增3到達,也可由023新增1到達。也可由0123新增1或3到達。

設dp[i][j] 0 <= j <= 5表示,經過i步,處於j狀態的數量。

a: dp[i][0] = dp[i-1][0];

b: dp[i][1] = dp[i-1][0]+dp[i-1][1]*2;

c: dp[i][2] = dp[i-1][0]+dp[i-1][2];

d: dp[i][3] = dp[i-1][1]+dp[i-1][3]*2;

e: dp[i][4] = dp[i-1][1]+dp[i-1][2]+dp[i-1][4]*2;

f: dp[i][5] = dp[i-1][3]+dp[i-1][4]+dp[i-1][5]*2;

#include #include #define mod 1000000007

using namespace std;

class solution

dp[0][0] = 1;

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

return dp[n-1][5]%mod;

}};int main()

{ int n = 0;

cin >> n;

solution s;

cout << s.funnum(n) <1,該題是一道典型的動態規劃問題。通過狀態機的跳轉,表示狀態之間的跳轉。

2,**很簡單,重要的是理解思路和抽象問題。

CCF模擬題 有趣的數詳解

問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位數字不為0。因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個 2031和2301。請計...

ccf 有趣的數

問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位數字不為0。因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個 2031和2301。請計...

ccf有趣的數

有趣的數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 我們把乙個數稱為有趣的,當且僅當 1.它的數字只包含0,1,2,3,且這四個數字都出現過至少一次。2.所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。3.最高位數字不為0。因此,符合我們定義的最小的有趣的數是...