题意:
给一个n*n的矩阵,矩阵里的数表示在这个点能走的距离长度,只能向右走或者向下走,求从左上角到右下角一共有多少种走法。
分析:
简单dp,状态O(n^2):dp[i][j]表示到(i,j)有多少种走法;转移O(1):dp[i][j]=sum{dp[i][j-k]}(g[i][j-k]==k,1<=k<=9)+sum{dp[i-k][j]}(g[i-k][j]==k,1<=k<=9)。
代码:
//poj 2704
//sepNINE
#include <iostream>
using namespace std;
const int maxN=40;
int g[maxN][maxN];
__int64 dp[maxN][maxN];
char tmp[maxN];
int main()
{int n,i,j,k;while(scanf("%d",&n)==1&&n!=-1){for(i=1;i<=n;++i){scanf("%s",tmp);for(j=0;j<n;++j)g[i][j+1]=tmp[j]-'0';}memset(dp,0,sizeof(dp));dp[1][1]=1;for(i=1;i<=n;++i)for(j=1;j<=n;++j){for(k=1;k<=9;++k)if(i-k<1)break;else if(g[i-k][j]==k)dp[i][j]+=dp[i-k][j]; for(k=1;k<=9;++k)if(j-k<1)break;else if(g[i][j-k]==k)dp[i][j]+=dp[i][j-k];}printf("%I64d\n",dp[n][n]);}return 0;
}