Pascal’s Travels
原题链接https://vjudge.net/contest/349774#problem/L
看到这道题的第一瞬间想起的是用bfs来写,,,然后记忆化超限了,然后并没有想到优化的方法,然后想起对于地图的跳跃背包可以实现,,需要,而且背包貌似就是做这种记录的,遍历所有位置,记录用背包记录当前位置可以跳跃的所有位置,最后汇总到终点的位置便是能够到达终点的方法总数
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<fstream>
#include<queue>
using namespace std;
long long map[50][50];
long long dp[50][50];
int main()
{
long long n;
while(~scanf("%lld",&n))
{
if(n==-1)
{
break;
}
long long i,j;
char ss;
for(i=1; i<=n; i++)
{
getchar();
for(j=1; j<=n; j++)
{
scanf("%c",&ss);
map[i][j]=ss-'0';
}
}
memset(dp,0,sizeof(dp));
dp[1][1]=1;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(map[i][j]!=0)
{
if(map[i][j]+i<=n)
{
dp[i+map[i][j]][j]+=dp[i][j];
}
if(map[i][j]+j<=n)
{
dp[i][j+map[i][j]]+=dp[i][j];
}
}
}
}
printf("%lld\n",dp[n][n]);
}
return 0;
}