【CCFCSP- 201312-4】有趣的数(线性dp)
題干:
| 試題編號: | 201312-4 |
| 試題名稱: | 有趣的數(shù) |
| 時間限制: | 1.0s |
| 內存限制: | 256.0MB |
| 問題描述: | 問題描述 我們把一個數(shù)稱為有趣的,當且僅當: 輸入格式 輸入只有一行,包括恰好一個正整數(shù)n (4 ≤ n ≤ 1000)。 輸出格式 輸出只有一行,包括恰好n 位的整數(shù)中有趣的數(shù)的個數(shù)除以1000000007的余數(shù)。 樣例輸入 4 樣例輸出 3 |
?
解題報告:
? ?首先2^4-1枚舉出所有的可能狀態(tài),然后分別進行轉移。dp[i][j]代表當前有i位,已經(jīng)使用過的數(shù)字對應狀態(tài)為j時的合法方案數(shù)。
注意對于這一思路有兩種解決:一個是轉移i-1到i這一位的時候是在后面添加數(shù)字,另一種是在前面添加數(shù)字。對于這一題而言,顯然前者比較簡單,因為通過題目可以分析得到:最后形成的這個數(shù)字的最高位一定是2所以從前往后增加位數(shù)的時候就會少討論很多情況,16個狀態(tài)不需要全部列舉出來。但是如果從后往前的話,也是可以先看dp[i][15]需要哪些狀態(tài),再去對那些狀態(tài)進行轉移,但是有個問題就是最后得到的答案可能含有前導零,所以我們需要先處理到dp[n-1],然后再自行累加到ans中,其實也是因為第一位必須是2這個條件。
? 注意狀態(tài)的定義,比如是dp[i][3],也就代表必須含有2和3,而,只含有2或者只含有3的方案數(shù) 就不應該被統(tǒng)計在內了。也就是說這個狀態(tài)不能由dp[i-1][2]再末尾添加一個2構成一個方案數(shù),而是只能添加一個3,因為要保證必須含有2和3(所以這里不用乘2)。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair using namespace std; const int MAX = 2e5 + 5; const ll mod = 1e9+7; ll dp[1055][16]; int main() {int n;cin>>n;dp[1][2] = 1;for(int i = 2; i<=n; i++) {dp[i][15] = (dp[i-1][11]+dp[i-1][14]+2*dp[i-1][15])%mod;dp[i][11] = (dp[i-1][10]+dp[i-1][3]+2*dp[i-1][11])%mod;dp[i][14] = (dp[i-1][12]+dp[i-1][10]+2*dp[i-1][14])%mod;dp[i][10] = (dp[i-1][2] + 2*dp[i-1][10])%mod;dp[i][12] = (dp[i-1][12]+2*dp[i-1][8]+dp[i-1][4])%mod;dp[i][3] = (dp[i-1][2]+dp[i-1][3])%mod;dp[i][2] = dp[i-1][2];}printf("%lld\n",dp[n][15]);return 0 ;}?
總結
以上是生活随笔為你收集整理的【CCFCSP- 201312-4】有趣的数(线性dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qclean.exe - qclean是
- 下一篇: 【POJ - 3616】Milking