uva825 - Walking on the Safe Side(动规)

本文介绍了一种使用动态规划(动规)及记忆化搜索解决迷宫最短路径计数问题的方法。核心思路在于定义dp[i][j]表示从点(i, j)到终点的所有可能路径数量,并通过状态转移方程dp[i][j]=dp[i+1][j]+dp[i][j+1]来更新每个状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动规, 记忆化搜索。。。。

思路不难

状态:dp[i][j]表示点(I,j)到终点的最短路径数目;

状态转移:dp[i][j] = dp[i+1][j]+dp[i][j+1];

还有就是这道题的测试数据很操蛋,两个数之间不是规律的有一个空格,有可能有多个空格,我卡到这一点上wa了好几次。

所以说读取的时候要用字符串读取。

代码如下;

#include <cstdio>
#include <cstring>
#define M 105
#define N 105
int m, n, a[N][N], d[N][N];
char s[N];
int dp(int x, int y)
{
    int &ans = d[x][y];
    if(ans) return ans;
    if(a[x][y]) return ans = 0;
    if(x==m&&y==n) return ans = 1;
    ans = 0;
    int nx = x+1, ny = y+1;
    if(nx<=m) ans+=dp(nx,y);
    if(ny<=n) ans+=dp(x,ny);
    return ans;
}
int main ()
{

    int cas, x, t, tt = 0;
    char ch;
    scanf("%d",&cas);
    while(cas--)
    {
        memset(a,0,sizeof(a));
        memset(d,0,sizeof(d));
        scanf("%d%d",&m,&n);
        for(int i = 1; i <= m; i++)
        {
            scanf("%d",&x);
            gets(s);
            int len = strlen(s);
            t = 0;
            for(int j = 0; j <= len; j++)
            {
                if(s[j]>='0'&&s[j]<='9') t = t*10+s[j]-'0';
                else { a[x][t] = 1; t = 0; }
            }
        }

        if(tt++) printf("\n");
        printf("%d\n",dp(1,1));
    }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值