結果

問題 No.663 セルオートマトンの逆操作
ユーザー imulanimulan
提出日時 2018-03-10 00:30:45
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 1,290 bytes
コンパイル時間 1,733 ms
コンパイル使用メモリ 166,000 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-04-19 06:21:22
合計ジャッジ時間 2,770 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 1 ms
6,944 KB
testcase_02 AC 2 ms
6,944 KB
testcase_03 AC 1 ms
6,944 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 1 ms
6,940 KB
testcase_08 AC 1 ms
6,944 KB
testcase_09 AC 2 ms
6,940 KB
testcase_10 AC 2 ms
6,940 KB
testcase_11 AC 2 ms
6,944 KB
testcase_12 AC 2 ms
6,944 KB
testcase_13 AC 2 ms
6,940 KB
testcase_14 AC 2 ms
6,944 KB
testcase_15 AC 2 ms
6,944 KB
testcase_16 AC 2 ms
6,944 KB
testcase_17 AC 2 ms
6,940 KB
testcase_18 AC 2 ms
6,944 KB
testcase_19 AC 2 ms
6,940 KB
testcase_20 AC 2 ms
6,940 KB
testcase_21 AC 2 ms
6,940 KB
testcase_22 AC 2 ms
6,940 KB
testcase_23 AC 2 ms
6,940 KB
testcase_24 AC 2 ms
6,940 KB
testcase_25 AC 2 ms
6,944 KB
testcase_26 AC 2 ms
6,944 KB
testcase_27 AC 2 ms
6,944 KB
testcase_28 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

inline int g(int x, int y, int z){
    if(x==0 && y==0 && z==0) return 0;
    if(x==1 && y==0 && z==0) return 0;
    if(x==1 && y==1 && z==1) return 0;
    return 1;
}

const int N = 2002;
const ll mod = 1e9+7;

int n;
int e[N];

int first,last;
ll dp[N][2][2];
ll dfs(int x, int l, int m){
    if(dp[x][l][m]>=0) return dp[x][l][m];

    ll ret = 0;
    if(x==n-2){
        return (g(l,m,last) == e[x] && g(m,last,first) == e[x+1]);
    }
    else{
        rep(i,2)if(g(l,m,i) == e[x]) (ret += dfs(x+1,m,i)) %= mod;
    }

    return dp[x][l][m] = ret;
}

int main(){
    cin >>n;
    rep(i,n) cin >>e[i];

    ll ans = 0;
    rep(i,2)rep(j,2){
        memset(dp,-1,sizeof(dp));
        first = i;
        last = j;
        (ans += dfs(0,j,i)) %= mod;
    }
    cout << ans << endl;
    return 0;
}
0