0568:Pasta
問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0568
動的計画法で解いた。
dp[i日目][j種類目のパスタ][l日連続]:=組み合わせの数
#include<iostream> #include<algorithm> #include<vector> #define A first #define B second using namespace std; typedef pair<int,int> P; int dp[102][4][3]; int main(void){ int n,k; cin >> n >> k; vector<P>v(k); for(int i=0;i<k;i++)cin >> v[i].A >> v[i].B; sort(v.begin(),v.end()); for(int i=1;i<4;i++)dp[1][i][1]=1; int p=0; for(int i=1;i<=n;i++){ for(int k=1;k<4;k++){ for(int l=1;l<3;l++){ if(i==v[p].A){ if(v[p].B==k && l<2)dp[i+1][k][l+1]+=dp[i][v[p].B][l]%10000; else if(v[p].B!=k)dp[i+1][k][1]+=dp[i][v[p].B][l]%10000; continue; } for(int j=1;j<4;j++){ if(j==k && l<2)dp[i+1][k][l+1]+=dp[i][j][l]%10000; else if(j!=k)dp[i+1][k][1]+=dp[i][j][l]%10000; } } } if(v[p].A==i)p++; } int ans=0; if(n==v[p-1].A){ for(int j=1;j<3;j++){ ans+=dp[n][v[p-1].B][j]; ans%=10000; } } else { for(int i=1;i<4;i++){ for(int j=1;j<3;j++){ ans+=dp[n][i][j]; ans%=10000; } } } cout << ans << endl; return 0; }