寝癖頭の解法

小学生の目線から、勉強中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #D - パスタ (Pasta)

第11回日本情報オリンピック 予選(過去問)から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#D - パスタ (Pasta)

atcoder.jp

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#D - パスタ (Pasta)
https://atcoder.jp/contests/joi2012yo/tasks/joi2012yo_d
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
const int mod=10000;
int main(void){
  int n,k;
  cin>>n>>k;
  vector<int> v(n,0);
  for(int i=0;i<k;i++){
    int a,b;
    cin>>a>>b;
    v[a-1]=b;
  }
  vector<vector<vector<int>>> dp(n+1,vector<vector<int>>(4,vector<int>(4,0)));
  dp[0][0][0]=1;
  for(int L=0;L<n;L++){
    for(int I=0;I<4;I++){
      for(int J=0;J<4;J++){
        for(int K=1;K<4;K++){
          if(v[L]!=0 && v[L]!=K){
            continue;
          }
          if(K!=I || I!=J){
            dp[L+1][K][I]+=dp[L][I][J];
            dp[L+1][K][I]%=mod;
          }
        }
      }
    }
  }
  int ans=0;
  for(int i=0;i<4;i++){
    for(int j=0;j<4;j++){
      ans+=dp[n][i][j];
      ans%=mod;
    }
  }
  cout<<ans<<endl;
  return 0;
}