【组合数学+动态规划】在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。
2016-03-03 15:22
477 查看
在如下8*6的矩阵中,请计算从A移动到B一共有__种走法。要求每次只能向上或向右移动一格,并且不能经过P。
A:456
B:492
C:568
D:626
E:680
F:702
解析:
8*6的矩阵,从左下角A到右上角B,一共需要走12步,其中5步向上,7步向右,因此总的走法一共有C(12,5)=792种,但题目规定不能经过P,因此需要减去经过P点的走法。
经过P的路径分为两部分,从A到P,从P到B。
同理,从A到P的走法:C(6,2)=15;
同理,从P到B的走法:C(6,3)=20;
因此从A到B经过P点的走法有15*20=300种,
所以从A到B不经过P点的走法有792-300=492种。
这题其实可以用程序算出来
简单的动态规划
dp[i][j] = dp[i][j-1] + dp[i-1][j];
代码如下:
或者如下图:
A:456
B:492
C:568
D:626
E:680
F:702
解析:
8*6的矩阵,从左下角A到右上角B,一共需要走12步,其中5步向上,7步向右,因此总的走法一共有C(12,5)=792种,但题目规定不能经过P,因此需要减去经过P点的走法。
经过P的路径分为两部分,从A到P,从P到B。
同理,从A到P的走法:C(6,2)=15;
同理,从P到B的走法:C(6,3)=20;
因此从A到B经过P点的走法有15*20=300种,
所以从A到B不经过P点的走法有792-300=492种。
这题其实可以用程序算出来
简单的动态规划
dp[i][j] = dp[i][j-1] + dp[i-1][j];
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <string> using namespace std; int main() { int dp[100][100] = {0}; for(int i = 1; i <= 6; i++) for(int j = 1; j <= 8; j++) dp[i][j] = dp[i-1][j] + dp[i][j-1]; int dp2[100][100] = {0}; dp2[0][1] = 1; for(int i = 1; i <= 4; i++) for(int j = 1; j <= 4; j++) dp2[i][j] = dp2[i-1][j] + dp2[i][j-1]; cout<<dp[6][8] - dp2[4][4] * dp[3][5]<<endl; return 0; }
或者如下图:
相关文章推荐
- 【微积分】 10 - 广义积分
- 简单的php数据库操作类代码(增,删,改,查)
- 【云计算】Netflix 开源持续交付平台 Spinnaker
- javascript else if
- 【bzoj1927】[Sdoi2010]星际竞速 费用流
- 深入解析RxJava源码(一)Observable对象的构建
- 可递归锁与非递归锁
- PHP的数组中提高元素查找与元素去重的效率的技巧解析
- MySQL存储引擎小知识
- 编辑界面案例分析,数据添加、移除、保存与取消操作
- HTML javacript 域名合法性检测
- std::string类的实现
- Android Support Library 23.2
- 数据结构,
- 开始做股票数据服务器
- SmartSVN上传项目遇到的问题
- AndroidStudio代码风格之保留单行(one line comments)的文档注释(JavaDoc)
- RecyclerView使用详解(二)
- JavaScript高级
- Bitbucket 让 pull request变得更强大,可即刻提升团队代码质量