动态规划入门——Pascal's Travels

转载请注明出处:http://blog.csdn.net/a1dark

分析:把起点标记为1、然后递推就OK了、

#include<stdio.h>
#include<string.h>
__int64 dp[38][38];
char st[38][38];
int mpt[38][38];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==-1)break;
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++){
            scanf("%s",st[i]);
            for(int j=0;j<n;j++)
                mpt[i][j]=st[i][j]-'0';
        }
        dp[0][0]=1;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(mpt[i][j]==0)continue;
                if(i+mpt[i][j]<n)
                    dp[i+mpt[i][j]][j]+=dp[i][j];
                if(j+mpt[i][j]<n)
                    dp[i][j+mpt[i][j]]+=dp[i][j];
            }
        }
        printf("%I64d\n",dp[n-1][n-1]);
    }
        return 0;
}


你可能感兴趣的:(ACM,动态规划入门)