算法一(前言-动态规划)
2016-07-22 02:02
281 查看
前言
算法有什么作用呢,在我的理解来看:算法可以锻炼自己的逻辑思维能力,问题解决能力,在特定的应用场合能够更快更好的确定计算方法,当然,在程序设计中,有各种各样需要解决的问题,算法是定的,人是活的,精通算法更多的是在思维上对人的帮助。最后:不懂算法的程序员不是合格的程序员
今天去面试,出了个算法题,题目如下:
在如下8*6的矩阵中,请计算从A移动到B一共有多少种走法。要求每次只能向上或向右移动一格,并且不能经过P
如果你对各种算法不熟悉 或者没有对类似问题做过思考与归纳总结,又或者你没有看过这方面的资料文献,那么如果你的思维能力不是很强,可能搞个半天不一定能够得出正确的答案 。
这个问题是属于典型的动态规划类的算法
假如A到B的总的走法为记为AB,
A到P记为AP,
P到B记为PB,
那么符合规则的走法RE = AB - (AP * PB);
横向假如设为x轴,纵向设为y,
用(x,y)表示各点的坐标
那么除A(1,1)点外y坐标为1的点的值(到此点的走法)都为1,除A(1,1)点外x坐标为1的点的值(到此点的走法)也都为1;除去以上点,那么各个点的走法为到他左边点的走法加上到它下面点的走法,用二维数组表示即为:arr[x][y]=arr[x-1][y]+[x][y-1];
C语言实现如下
int count(int x,int y){ int dp[100][100] = {0}; for(int i=1;i<=x;i++){ for(int j=1;j<=y;j++){ if((i == 1 || j==1) && (i != j)){ dp[i][j] = 1; }else{ dp[i][j] = dp[i][j-1]+dp[i-1][j]; } } } return dp[x][y]; }
php实现如下
function roadcount($x,$y){ $arr = array(); for($i=0;$i<=$x;$i++){ for($j=0;$j<=$y;$j++){ if($i==0 || $j==0){ $arr[$i][$j] = 0; }else if(($i==1 || $j==1) && ($i != $j)){ $arr[$i][$j] = 1; }else{ $arr[$i][$j] = $arr[$i-1][$j]+$arr[$i][$j-1]; } } } return $arr[$x][$y]; }
Python实现
def roadcount(x,y): x = x+1; y = y+1; list = [([0]*(y)) for i in range((x))]; for i in range(1,x): for j in range(1,y): if (i == 1 or j==1) and (i !=j): list[i][j] = 1; else: list[i][j] = list[i-1][j] + list[i][j-1]; return list[x-1][y-1];
如果你没得卵事,可以用ruby、js、perl等语言实现它 但是最核心是:
dp[i][j] = dp[i][j-1]+dp[i-1][j];
即后面的数据与前面的数据有某种因果关系。所有这种类似的问题都可以用这种模型去解决。这就体现了学习算法的最主要作用:思维+模式;
活学活用,不要死记!!!
从下一节起,将会研究各种算法
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法