careercup-递归和动态规划 9.2
2024-10-12 21:14:22
9.2 设想有个机器人坐在X*Y网格的左上角,只能向右、向下移动。机器人从(0,0)到(X,Y)有多少种走法?
进阶:
假设有些点为“禁区”,机器人不能踏足。设计一种算法,找到一条路径,让机器人从左上角移动到右下角。
类似leetcode:Unique Paths和Unique Paths II
解法:
我们需要数一数机器人向右X步、向下Y步,总共可以走多少种路径。这条路径总共有X+Y步。
为了走出一条路径,我们实质上要从X+Y步为向右移动。因此,可能路径的总数就是从X+Y项中选出X项的方法总数。具体可以用下面的二项式(又称“n选r”)表示:
动态规划实现C++代码:
#include<iostream>
#include<vector>
using namespace std; //没有障碍时
int uniquePaths(int m,int n)
{
int path[m][n];
int i,j;
for(i=;i<m;i++)
path[i][]=;
for(j=;j<n;j++)
path[][j]=;
for(i=;i<m;i++)
{
for(j=;j<n;j++)
path[i][j]=path[i][j-]+path[i-][j];
}
return path[m-][n-];
} //存在障碍时
int uniquePathsII(vector<vector<int> > &obstacle)
{
int m=obstacle.size();
int n=obstacle[].size();
if(m==||n==)
return ;
int path[m][n];
int i,j;
if(obstacle[][]==)
return ;
path[][]=;
for(i=;i<m;i++)
{
if(obstacle[i][]==)
path[i][]=;
else
path[i][]=path[i-][];
}
for(j=;j<n;j++)
{
if(obstacle[][j]==)
path[][j]=;
else
path[][j]=path[][j-];
}
for(i=;i<m;i++)
{
for(j=;j<n;j++)
{
if(obstacle[i][j]==)
path[i][j]=;
else
path[i][j]=path[i-][j]+path[i][j-];
}
}
return path[m-][n-];
} int main()
{
cout<<uniquePaths(,)<<endl;
vector<vector<int> > vec={{,,},{,,},{,,}};
cout<<uniquePathsII(vec)<<endl;
}
最新文章
- iOS阶段学习第32天笔记(页面传值方法介绍)
- 利用CNN进行人脸年龄预测
- HTTP 源码解读
- iOS之02-第一个OC的类
- C#算法之向一个集合中插入随机不重复的100个数
- 以Self Host的方式来寄宿Web API
- log4net 日志写入MongoDB 实现分布式日志
- Java类的初始化过程及清理
- this的分析分支
- webstorm配置react
- JS表格排序
- bonecp使用数据源
- Hibernate2---- 查询单条记录
- ACdream 1015 Double Kings 树的重心
- MSSql-1内部数据库版本号
- figlet
- ImportError: dynamic module does not define module export function (PyInit__sqlite3)
- 59.phpstudy升级Mysql的正确姿势
- python爬虫之urllib
- 如何以SYSTEM用户运行CMD
热门文章
- 快速扫描文本文件,统计行数,并返回每一行的索引位置(Delphi、C#)
- Dojo Widget系统(转)
- 编译android后找不到ramdisk-u.img[已解决]
- 如何用C#获得文件信息以及扩展信息
- BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)
- java web的一些特殊用法(一)
- SSL双向认证(高清版)
- CONTAINING_RECORD 宏
- Robotium 系列(1)
- C#索引器的作用及使用