0203-A New Plan of Aizu Ski Resort

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0203&lang=jp

動的計画法
上からの進入と左右からの進入の場合わけが面倒。

int x,y,M[50][50],D[50][50],i,j,r;
main(){
        for(;;){
                scanf("%d%d",&x,&y);
                if(x==0)exit(0);
                for(i=0;i<289;i++) {M[i%17][i/17]=1;D[i%17][i/17]=0;}
                for(i=0;i<y;i++)
                        for(j=0;j<x;j++)
                                scanf("%d",&M[j+1][i]);
                for(j=1;j<=x;j++){if(M[j][y-1]!=1)D[j][y-1]=1;D[j][y]=1;}
                for(j=y-2;j>=0;j--){
                        for(i=1;i<=x;i++){
                                if(M[i][j]==0) {
                                        D[i][j]=D[i][j+1];
                                        if(M[i+1][j+1]!=2) D[i][j]+=D[i+1][j+1];
                                        if(M[i-1][j+1]!=2) D[i][j]+=D[i-1][j+1];
                                }
                                if(M[i][j]==2) D[i][j]=D[i][j+2];
                        }
                }
                r=0;
                for(i=1;i<=x;i++){
                        r+=D[i][0];
                }
                printf("%d\n",r);
        }
}