1. 程式人生 > >多米諾骨牌 DOMINO

多米諾骨牌 DOMINO

【題目描述】

Jzabc對多米諾骨牌有很大的興趣,然而他的骨牌比較特別,只有黑的和白的。他覺得如果存在連續三個骨牌是同種顏色的,那這個骨牌排列就是不美觀的。現在他有N個骨牌要排列,他想知道不美觀的排列的個數。他想請你幫忙進行統計不美觀排列的個數。

【輸入格式】

只有一個正整數,即要排列的骨牌的個數。

【輸出格式】

一個數,即不美觀的排列的個數。

【輸入樣例】

4

【輸出樣例】

6

解釋:有6中不美觀的排列。

【資料規模】

對於20%的資料,滿足N<=60

對於50%的資料,滿足N<=600

對於100%的資料,滿足N<=20000

一開始不會 就沒再做

後來小夥伴們提醒了一下有規律

於是打表1-10


發現G(i+1)可以由Gi*2+一個具有斐波那契數列性質的數列中某一項推出

所以遞推出的Gi

由於資料太大 用到了壓8位高精度

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[4][811];
int z[811];
int m,n=1,a,b,c;

void print(int s[811])
{
    int a;
    for(a=800;a>1;a--)if(s[a])break;
    cout<<s[a];a--;
    while(a)
    {
        if(s[a]<10000000)cout<<'0';
        if(s[a]<1000000)cout<<'0';
        if(s[a]<100000)cout<<'0';
        if(s[a]<10000)cout<<'0';
        if(s[a]<1000)cout<<'0';
        if(s[a]<100)cout<<'0';
        if(s[a]<10)cout<<'0';
        cout<<s[a];
        a--;
    }
}

void jinwei(int s[811])
{
    int a;
    for(a=1;a<=800;a++)
    if(s[a]>99999999)
    {
        s[a+1]=s[a+1]+s[a]/100000000;
        s[a]%=100000000;
    }
}

void addf()
{
    int a;
    n++;
    n%=3;
    int l=(n-2+3)%3;
    int r=(n-1+3)%3;
    for(a=1;a<=800;a++)f[n][a]=f[l][a]+f[r][a];
    jinwei(f[n]);
}

void cheng()
{
    int a;
    for(a=1;a<=800;a++)z[a]*=2;
    jinwei(z);
}

void jia()
{
    int a;
    for(a=1;a<=800;a++)z[a]+=f[n][a];
    jinwei(z);
}

int main()
{
    freopen("domino.in","r",stdin);
    freopen("domino.out","w",stdout);
    scanf("%d",&m);
    if(m<3)
    {
        cout<<0<<endl;
        return 0;
    }
    z[1]=2;
    f[0][1]=0;
    f[1][1]=2;
    
    for(a=4;a<=m;a++)
    {
        addf();
        cheng();
        jia();
    }
    print(z);
    return 0;
}
        
別人的題解是

考慮美觀的情況,設f[i]為i個骨牌的排列中完美排列的數量。若在第i個位置上放與i-1個骨牌顏色相同的骨牌,則情況數為f[i-2],否則為f[i-1],那麼f[i]:=f[i-1]+f[i-2]。由二進位制的數量可得,此時不完美排列個數即為g[i]:=2^n-f[i]。

這個想法簡直是dbl...瞬間就跪爛了

我的理解是

當i與i-1顏色不同時

不會影響完美排列數 所以f[i]=f[i-1]

當顏色相同時

就有可能影響到完美排列

i-3i-2 i-1i

X0 11這種情況下 f[i]=f[i-1]=f[i-2]  因為從i-1到i顏色相同 i-1和i對f[i]沒做出貢獻 與f[i-2]相比 f[i]既沒增加也沒減少 

X1 11這種情況下f[i]=f[i-2]  因為從i-2到i顏色相同 i-1和i對f[i]沒做出貢獻 與f[i-2]相比 f[i]既沒增加也沒減少

所以f[i]=f[i-1]+f[i-2]

不完美的就是2^n-f[i]

Orz