您的位置:首页 > 其它

算法一(前言-动态规划)

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];

即后面的数据与前面的数据有某种因果关系。所有这种类似的问题都可以用这种模型去解决。这就体现了学习算法的最主要作用:思维+模式;

活学活用,不要死记!!!

从下一节起,将会研究各种算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法