啊啊啊,刺猬书的动态规划看的一知半解,,怎么用!!!晕死了。。稍微做一下记录,后面再看看会不会有更好的理解呢~
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);
}
}