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<=n;i++)
{
q[

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

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



