1. 程式人生 > >ccf有趣的數 dp

ccf有趣的數 dp

問題描述

  我們把一個數稱為有趣的,當且僅當:
  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

這道題用的dp動態規劃思想,先考慮以下對符號串的分類,因為這道題中符合的數字應該是以2開頭的,所以下面所有的符號都保證以2開頭的

第一種符號串,只包含數字2

第二種符號串,只包含數字2和數字0

第三種符號串,只包含數字2和數字3

第四種符號串,只包含數字2,0和1,且滿足0在1前頭

第五種符號串,只包含數字2,0和3,且滿足2在3前頭

第六種符號串,包含數字2,0,1,3,且滿足0在1前頭,2在3前頭

然後我們看他們的遞推關係

第一種長度為L的符號串只有1種,記做f(L,S1)

第二種長度為L的符號串的個數記做f(L,S2)=f(L-1,S2)*2+f(L-1,S1),因為第二種符號串可以看做,長度為L-1的S2符號串在後面加上一個2或者一個0,還有可能是S1符號串加上了一個2。提示(第二種符號串中至少有一個0,而第一種符號串中沒有0,以下以此類推)

第三種長度為L的符號串的個數記做f(L,S3)=f(L-1,S3)+f(L-1,S1),因為第二種符號串可以看做,長度為L-1的S2符號串在後面加上一個3,還有可能是S1符號串加上了一個3.

第四種長度為L的符號串的個數記做f(L,s4)=f(L-1,S4)*2+f(l-1,S2),因為第四種符號串可以看做,長度為L-1的S4符號串在後面加了一個2或者1,還有可能是S2符號串在後面加了一個1.

以此類推,最後可以得到長度為L的第六種符號串的長度。

程式碼如下

#include<bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
long long f[1010][10];
int main()
{

    int n;
    cin>>n;
    memset(f,0,sizeof(f));
    f[1][1]=1;
    for(int i=2; i<=n; ++i)
    {

        f[i][1]=1;
        f[i][2]=(f[i-1][2]*2+f[i-1][1])%mod;
        f[i][3]=(f[i-1][3]+f[i-1][1])%mod;
        f[i][4]=(f[i-1][4]*2+f[i-1][2])%mod;
        f[i][5]=(f[i-1][5]*2+f[i-1][2]+f[i-1][3])%mod;
        f[i][6]=(f[i-1][6]*2+f[i-1][5]+f[i-1][4])%mod;
    }
    cout<<f[n][6];
}
 

相關推薦

ccf有趣 dp

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

ccf 有趣(數位dp

問題描述   我們把一個數稱為有趣的,當且僅當:   1. 它的數字只包含0, 1, 2, 3,且這四個數字都出現過至少一次。   2. 所有的0都出現在所有的1之前,而所有的2都出現在所有的3之

ccf有趣

201312-4 試題名稱: 有趣的數 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   我們把一個數稱為有趣的,當且僅當:   1. 它的數字只包含0, 1, 2, 3,且這四個數字都

CCF 有趣

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

使用PHP實現水仙花及各種特殊有趣的輸出

php 水仙花數 特殊數據 有趣 算法尊敬的讀者,見文好。本文包含以下內容:1,為什麽要寫這篇文章!2,具體的方案及代碼實現!3,你可能遇到的問題!4,文末本文測試用源碼網盤地址!特殊說明:本文使用的語言是PHP;本文運行的環境是:Apache2.4, PHP5.6 。第一部分:為什麽要寫這篇文章!因為經常會

XJOI 傳送(線性篩數論函,dp)

mes col pad img es2017 png cstring char wid 這題就是篩了一個除數函數,沒什麽好說的 #include<cstdio> #include<cstring> #include<cs

hiho 1617 - 方格取 - dp

包含 ring width ++ 多少 png es2017 alt 不能 題目鏈接 描述 給定一個NxN的方格矩陣,每個格子中都有一個整數Aij。小Hi和小Ho各自選擇一條從左上角格子到右下角格子的路徑,要求路徑中每一步只能向右或向下移動,並且兩條路徑不能相交(除了左上右

BZOJ 1026--windy(DP&容斥)

scan des 數字 cst -- ace ans input data 1026: [SCOI2009]windy數 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8856 Solved: 4007[Submit]

Codeforces Round #100 E. New Year Garland (第二類斯特林+dp)

using 情況 inline 顏色不同 force jai 相同 其中 problem 題目鏈接: http://codeforces.com/problemset/problem/140/E 題意: 聖誕樹上掛彩球,要求從上到下掛\(n\)層彩球。已知有\(m\)種顏色

CCF--中間--用JAVA威尼斯人平臺出租語言實現

大於 ref import 一行 排序 代碼 sys ccf 繼續 問題描述威尼斯人平臺出租 haozbbs.com Q1446595067   在一個整數序列a1, a2, …, an中,如果存在某個數,大於它的整數數量等於小於它的整數數量,則稱其為中間數。在一個序列

10.15二中校內T3 方案dp

10.15 T3 Dp **3.棋子 (chess.cpp/c/pas) 【問題描述】 Magolor要在長方形的棋盤上放置棋子。 他有一個n*m格的棋盤,以及k種不同顏色的棋子。第i種顏色的棋子有a_i個,同樣顏色的棋子沒有區別。他要把這些棋子全部放到棋盤中,但是有些棋子會互相

藍橋杯 K好 DP

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

CCF——中間(2016-12)

說明:定義兩個臨時變數分別儲存大於此數的個數和小於此數的個數,然後比較這兩個變數是否相等即可。特別注意:min和max為0,也有中間數,比如2 2 2 2的中間數為2 import java.util.Scanner; public class 中間數 { public static voi

洛谷P1004 方格取 dp

這一題相當於兩個人從左上角走到右上角 dp[i][j][k][l]表示第一個人走到(i,j)第二個人走到(k,l)時取到數總和的最大值 dp[i][j][k][l]=max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1

CCF NOI1035. 根 (C++)

1035. 數根 題目描述 數根是這樣定義的:對於一個正整數n,將它的各個數位上的數字相加得到一個新數,如果這個數是一位數,我們就稱之為n的數根,否則重複處理直到它成為一個一位數。 例如,n=34,3+4=7,7是一位數,所以7是34的數根。 再如,n=345,3+4+5

滴滴出行 數字和為sum的方法(dp)

給定一個有n個正整數的陣列A和一個整數sum,求選擇陣列A中部分數字和為sum的方案數。 當兩種選取方案有一個數字的下標不一樣,我們就認為是不同的組成方案。 輸入描述: 輸入為兩行: 第一行為兩個正整數n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000

滴滴出行 數字和為sum的方法(dp)

給定一個有n個正整數的陣列A和一個整數sum,求選擇陣列A中部分數字和為sum的方案數。 當兩種選取方案有一個數字的下標不一樣,我們就認為是不同的組成方案。 輸入描述: 輸入為兩行: 第一行為兩個正整數n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000) 第二行為n個正

sincerit 一卡通大冒險(集合劃分問題(貝爾) dp)

一卡通大冒險 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2912 Accepted Submission(s): 1975 Pro

【CF 140E】New Year Garland(第二類斯特林(Stirling)+DP+容斥)

As Gerald, Alexander, Sergey and Gennady are already busy with the usual New Year chores, Edward hastily decorates the New Year Tree. And any decent New Ye

CCF 相鄰

#include <iostream> #include<cstring> #include<algorithm> #include<stack> #include<list> #include<queu