DP:
#include "stdio.h"
#include "string.h"
int main()
{
int i,j,n;
char ch;
__int64 dp[101][101],a[101][101];
while (scanf("%d",&n)!=EOF)
{
if (n==-1) break;
for (i=1;i<=n;i++)
{
getchar();
for (j=1;j<=n;j++)
{
scanf("%c",&ch);
a[i][j]=ch-'0';
}
}
memset(dp,0,sizeof(dp));
dp[1][1]=1;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (i==n && j==n) continue;
dp[i+a[i][j]][j]+=dp[i][j];
dp[i][j+a[i][j]]+=dp[i][j];
}
/* for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
printf("%d ",dp[i][j]);
printf("\n");
}*/
printf("%I64d\n",dp[n][n]);
}
return 0;
}
记忆化搜索:
#include "stdio.h"
#include "string.h"
__int64 dp[101][101],a[101][101];
int n;
__int64 dfs(int x,int y)
{
int xx,yy;
if (a[x][y]==0) return dp[x][y];
if (dp[x][y]) return dp[x][y];
xx=x+a[x][y];
if (xx<=n) dp[x][y]+=dfs(xx,y);
yy=y+a[x][y];
if (yy<=n) dp[x][y]+=dfs(x,yy);
return dp[x][y];
}
int main()
{
int i,j;
char ch;
while(scanf("%d",&n)!=EOF)
{
if (n==-1) break ;
for (i=1;i<=n;i++)
{
getchar();
for (j=1;j<=n;j++)
{
scanf("%c",&ch);
a[i][j]=ch-'0';
}
}
memset(dp,0,sizeof(dp));
dp[n][n]=1;
printf("%I64d\n",dfs(1,1));
}
return 0;
}