这个题刚开始我想DFS了,搞了搞,发现你只要到右下角就可以,也就是说你从右下角回溯到左上角就可以
#include<iostream>
#include<cstdio>#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
/*
记忆化搜索
dp[i][j] 表示到(i,j)点需要的步数
*/
int map[109][109];
char op[109][109];
ll dp[109][109];
int n;
ll sum;
ll dfs()
{
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
if(dp[i][j]&&map[i][j])
{
if(i+map[i][j]<n)
dp[i+map[i][j]][j]+=dp[i][j];
if(j+map[i][j]<n)
dp[i][j+map[i][j]]+=dp[i][j];
}
}
}
return dp[n-1][n-1];
}
int main()
{
while(~scanf("%d",&n))
{
if(n==-1)break;
for(int i = 0; i<n; i++)
scanf("%s",op[i]);
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
map[i][j] = op[i][j] - '0';
}
}
printf("%I64d\n",dfs());
}
return 0;
}
本文介绍了一种使用记忆化搜索解决特定路径问题的方法,该问题是在一个由数字组成的矩阵中寻找从左上角到右下角的可达路径数量。通过动态规划预先计算并储存中间结果来避免重复计算,提高算法效率。
4万+

被折叠的 条评论
为什么被折叠?



