BSOJ1495 拾垃圾的机器人3451

这篇博客介绍了如何使用动态规划解决一个关于机器人拾垃圾的问题。机器人在n*m的矩阵中,只能向右或向下移动,目标是计算最多能拾到多少垃圾以及在最多垃圾的情况下有多少种不同的行走方案。博主分享了具体的动态规划状态转移方程,并强调了使用long long类型处理边界情况的重要性。
摘要由CSDN通过智能技术生成

Description

有一块地被划分成了n*m个区域,在一些区域里有垃圾要拾捡。
现在科研人员开发了一个能捡垃圾的机器人,机器人每一次都可以移动一个区域的距离。
假设机器人从最左上区域出发,他每次只能向右或者向下走。
每次他到达一个点,就会自动把这个点内的垃圾拾掉。
  问:该机器人最多能够拾多少垃圾?
  在最多情况下,有多少种方案?

Input

输入文件的第一行为两个整数n和m;
  接下来有一个n*m的01矩阵。
矩阵中的第i行j列的数字a[i][j]=0表示为空地。
a[i][j]=1表示为垃圾。

Output

输出两行,第一行为一个数字表示最多拾到的垃圾,第二行为一个数字表示在最多情况下,有多少种方案。

Sample Input

3 3
100
000
010

Sample Output

2
3

今天也是菜得水3级题的一天呢

因为机器人只能向下和向右走,满足无后效性。

所以我们考虑用DP作答。

首先,从输入上就有那么一个小小的坑就只有我觉得是坑吧,请大家研究一下矩阵的输入。

科科,是没有空格的。

所以我们要用string或者char数组来读入~

接着分析题意。

对于题目中的人工智障机器人,它到一个点的路径只有两
种:从上来或者从左来。

也就是说,对于题目中的点a[i][j],它只可能源于点a[i-1][j]点a[i][j-1]

这点理清了,下面就可以顺理成章地理解了。

一:求最多捡到的垃圾

我们可以用f[i][j]来统计捡到的最多垃圾数。由加法原理得出,f[i][j]=f[i-1][j]+f[i][j-1]

实现代码:

//DP求最多拾到的垃圾 
for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
		f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];

这样下来,f[n][m]就是到达终点时捡到的最多垃圾数。即我们要的答案。

二:求在最多情况下,有多少种方案?

我们可以用q[i][j]来统计f最大时的方案数。

可得**有q[i][j]=q[i-1][j]C1+q[i][j-1]C2。

其中,若f[i-1][j]+a[i][j]==f[i][j],则C1=1,反之为0

若f[i][j-1]+a[i][j]==f[i][j],则C2=1,反之为0;

但是这样做还有一个问题:边界值的问题。

对于矩阵来说,最上和最右的点,是一定可以到达的。所以,我们可以把它们的初值赋为1。

这样一来,我们的计算式子不仅有了初始值,还没有了越界的漏洞。

实现代码:

//DP求路径数 
for(int i=1;i
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值