我們把乙個數稱為有趣的,當且僅當:
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。因此,符合我們定義的最小的有趣的數是...