日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CCFCSP- 201312-4】有趣的数(线性dp)

發(fā)布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CCFCSP- 201312-4】有趣的数(线性dp) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題干:

試題編號:201312-4
試題名稱:有趣的數(shù)
時間限制:1.0s
內存限制:256.0MB
問題描述:

問題描述

  我們把一個數(shù)稱為有趣的,當且僅當:
  1. 它的數(shù)字只包含0, 1, 2, 3,且這四個數(shù)字都出現(xiàn)過至少一次。
  2. 所有的0都出現(xiàn)在所有的1之前,而所有的2都出現(xiàn)在所有的3之前。
  3. 最高位數(shù)字不為0。
  因此,符合我們定義的最小的有趣的數(shù)是2013。除此以外,4位的有趣的數(shù)還有兩個:2031和2301。
  請計算恰好有n位的有趣的數(shù)的個數(shù)。由于答案可能非常大,只需要輸出答案除以1000000007的余數(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。