(1208)HDU-记忆化搜索

这个题刚开始我想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;
}

你可能感兴趣的:((1208)HDU-记忆化搜索)