动态规划问题和贪心算法

啊啊啊,刺猬书的动态规划看的一知半解,,怎么用!!!晕死了再见。。稍微做一下记录,后面再看看会不会有更好的理解呢~

1. 什么是动态规划?

与递归相反,从底部解决问题,将所有的小问题解决掉,然后合并成一个整体解决方案,从而解决掉整个大问题。

(感觉就是针对数组的各种操作,用数组替代递归的操作,因为递归每次都要算一遍,耗时)

1)斐波那契数列

function dynFib(n) {
    var val = [];
    for (var i = 0; i <= n; ++i) {
        val[i] = 0; 
    }
    if (n == 1 || n == 2) {
         return 1;
    }
    else {
         val[1] = 1;
         val[2] = 2;
         for (var i = 3; i <= n; ++i) {
             val[i] = val[i-1] + val[i-2];
         }
         return val[n-1];
    }
}
2)寻找公共字符串

a)初始化两个变量及一个二维数组。

function lcs(word1, word2) {
    var max = 0;
    var index = 0;
    var lcsarr = new Array(word1.length + 1);
    for (var i = 0; i <= word1.length + 1; ++i) {
        lcsarr[i] = new Array(word2.length + 1);
        for (var j = 0; j <= word2.length + 1; ++j) {
            lcsarr[i][j] = 0;//对数组进行初始化
        }
    }
//构建用于保存字符匹配记录的表。数组的第一个元素总是设为0, 如果两个字符串相应位置的字符串匹配,当前数组元素的值会被设置为前一次循环中数组元素保存的值加1.
    for (var i = 0; i <= word1.length; ++i) {
        for (var j = 0; j <= word2.length; ++j) {
            if (i == 0 || j == 0) {
                 lcsarr[i][j] = 0;
            } else {//如果两个位置字符相同,则+1,不同就是0
                 if (word1[i - 1] == word2[j - 1]) {
                      lcsarr[i][j] = lcsarr[i - 1][j - 1] + 1;
                 } else {
                      lcsarr[i][j] = 0;
                 }
             }
             if (max < lcsarr[i][j]) {
                  max = lcsarr[i][j];
                  index = i;
             }
         }
     }
     var str = "";
     if (max == 0) {
          return "";
     } else {
          for (var i = index - max; i <= max; ++i) {
              str += word2[i];
          }
        return str; }
}



2. 什么是贪心算法?

贪心算法的目的是通过寻找最优解,达成整体解决方案。

1)找零问题:从商店购买了一些商品,找零 63 美分,店员要怎样给你这些零钱呢?如果店员根据贪心算法来找零的话,他会给你两个 25 美分、一个10 美分和三个 1 美分。在没有使用 50 美分的情况下这是最少的硬币数量。 

 function makeChange(origAmt, coins) {
     var remainAmt = 0;
     if (origAmt % .25 < origAmt) {
         coins[3] = parseInt(origAmt / .25);
         remainAmt = origAmt % .25;
         origAmt = remainAmt;
     }
     if (origAmt % .1 < origAmt) {
         coins[2] = parseInt(origAmt / .1);
         remainAmt = origAmt % .1;
         origAmt = remainAmt;
     }
     if (origAmt % .05 < origAmt) {
         coins[1] = parseInt(origAmt / .05);
         remainAmt = origAmt % .05;
         origAmt = remainAmt;
     }
     coins[0] = parseInt(origAmt / .01);
}
function showChange(coins) {
    if (coins[3] > 0) {
        print("25 美分的数量 - " + coins[3] + " - " + coins[3] * .25); }
    if (coins[2] > 0) {
        print("10 美分的数量 - " + coins[2] + " - " + coins[2] * .10);
    }
    if (coins[1] > 0) {
        print("5 美分的数量 - " + coins[1] + " - " + coins[1] * .05); }
    if (coins[0] > 0) {
        print("1 美分的数量 - " + coins[0] + " - " + coins[0] * .01);
    } 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值