AOJ 0547 Commute routes

問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0547

解法
動的計画法

#include <cstdio>
#include <algorithm>
using namespace std;

const int MOD = 100000;

typedef pair<int, int> P;
typedef pair<P, P> PP;

PP dp[101][101];

int main(){
	int h, w;
	for(int i=0; i < 101; i++){
		dp[i][0] = PP(P(0,0), P(0,0));
		dp[0][i] = PP(P(0,0), P(0,0));
	}
	while(scanf("%d %d", &h, &w) && h + w != 0){
		dp[2][1] = PP(P(0,0), P(1,0));
		dp[1][2] = PP(P(1,0), P(0,0));
		for(int i = 1; i <= h; i++){
			for(int j = 1; j <= w; j++){
				if((!(i==2&&j==2))&&(i==1||i==2)&&(j==1||j==2)) continue;
				PP ta = dp[i][j-1];
				PP yo = dp[i-1][j];
				dp[i][j] = PP(
					P((ta.first.first + ta.first.second) % MOD,
					  ta.second.first ),
					P((yo.second.first + yo.second.second) % MOD,
					  yo.first.first )
				);
			}
		}
		PP pp = dp[h][w];
		printf("%d\n", (pp.first.first + pp.first.second + pp.second.first + pp.second.second) % MOD);
	}
	return 0;
}