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

前言

算法有什么作用呢,在我的理解来看:算法可以锻炼自己的逻辑思维能力,问题解决能力,在特定的应用场合能够更快更好的确定计算方法,当然,在程序设计中,有各种各样需要解决的问题,算法是定的,人是活的,精通算法更多的是在思维上对人的帮助。
最后:不懂算法的程序员不是合格的程序员

今天去面试,出了个算法题,题目如下:
在如下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];
即后面的数据与前面的数据有某种因果关系。所有这种类似的问题都可以用这种模型去解决。这就体现了学习算法的最主要作用:思维+模式;
活学活用,不要死记!!!

从下一节起,将会研究各种算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值