201312-4有趣的数

#include <bits/stdc++.h>
// 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。

//1.动态规划求解
//2.由题意可得最高位的数值是2
//3.以剩余为使用的元素作为基准开始进行动态规划的递推
//4.注意要在运算的过程中取余(在运算的过程中取余和得到最后的结果再取余的答案一样,但能适应存储) 
 
using namespace std;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    long long mod = 1000000007;
    long long int n;
    cin>>n;
    long long **states = new long long *[n+1];
    for(long long i =0;i<n+1;++i)
    states[i] = new long long[6];
    for(long long i=0;i<6;++i)
    states[0][i]=0;
    /*
    0---剩下 013
    1---剩下13
    2---剩下01
    3---剩下3
    4---剩下1
    5---无 
    */
    for(long long i=1;i<=n;++i){
        long long j=i-1;
        states[i][0] = 1;
        states[i][1] = (states[j][0]+states[j][1]*2)%mod;
        states[i][2] = (states[j][0]+states[j][2])%mod;//对于2状态已经有了3了,所以只能放2
        states[i][3] = (states[j][1]+states[j][3]*2)%mod;
        states[i][4] = (states[j][1] + states[j][2]+states[j][4]*2)%mod;
        states[i][5] = (states[j][3] + states[j][4] + states[j][5]*2)%mod;//当2031已经凑全后,后面只能放1和3 
    } 
    cout<<states[n][5]<<endl;
    return 0;
 } 

 

posted @ 2020-09-27 16:50  zmachine  阅读(127)  评论(0编辑  收藏  举报