题意:
给一个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;
}