0547:Commute routes
メモ化再帰で解いた。
dp[i][j][p]:=現在(i,j)にいて、状態pである。
i…南北
j…東西
p=
1…直前に曲っていて、東に進んでいる
→東に進み、p=3
2…直前に曲っていて、北に進んでいる
→北に進み、p=4
3…直前に曲っていない、東に進んでいる
→東に進み、p=3 または 北に進み、p=2
4…直前に曲っていない、北に進んでいる。
→北に進み、p=4 または 東に進み、p=1
#include<iostream> #include<cstdio> using namespace std; int dp[101][101][5],w,h; int func(int i, int j, int p){ if(i>w || j>h)return 0; if(i==w && j==h)return 1; if(dp[i][j][p]>0)return dp[i][j][p]; int res=0; if(p==1)res=func(i,j+1,3); else if(p==2)res=func(i+1,j,4); else if(p==3)res=func(i+1,j,2)+func(i,j+1,3); else if(p==4)res=func(i+1,j,4)+func(i,j+1,1); else if(p==0)res=func(i,j+1,3)+func(i+1,j,4); return dp[i][j][p]=res%100000; } int main(void){ while(cin >> w >> h,w|h){ for(int i=0;i<=w;i++) for(int j=0;j<=h;j++) for(int p=0;p<5;p++) dp[i][j][p]=0; cout << func(1,1,0) << endl; } return 0; }