[leetcode]494. Target Sum -- JavaScript动态规划求解
2017-03-28 15:31
302 查看
先上代码:
这道题一开始我是用递归的方式求解,但是会超时,因此就改用了动态规划。
下面说一下对于这道题我的理解,动态规划我也不是很熟悉,仅作为参考吧,欢迎指正。
首先说一下这道题主要的思路。
第一,在我们对数组的访问过程中,动态规划数组dp,是不断变化的。
第二,动态数组dp的含义:当我们对数据访问到某个阶段m的时候,dp
的含义就表示,在阶段m这一刻时,到达n的可选方式有dp
种。
针对本道题来说,就是当我对数组访问到第m个的时候,那么这前m-1个数字所能组合成结果n的方式有dp
种。
第三,初始条件dp[0+sum] = 0的含义:当我们没有对数组进行任何访问的时候,我们可以获得总和0的选择有且只有一种,那就是数组中的数我们一个都不选。
var findTargetSumWays = function(nums, S) { var sum = 0; nums.forEach(function(num){ sum += num; }); if(S>sum || S<-sum) return 0; var dp = []; dp[0+sum] = 1; var maxIndex = sum*2+1; nums.forEach(function(num){ var tmp = []; for(var k=0;k<maxIndex;k++){ if(dp[k] !== undefined && dp[k] !== 0){ if(tmp[k+num] === undefined){ tmp[k+num] = dp[k]; }else{ tmp[k+num] += dp[k]; } if(tmp[k-num] === undefined){ tmp[k-num] = dp[k]; }else{ tmp[k-num] += dp[k]; } } } dp = tmp; }); return dp[S+sum]===undefined?0:dp[S+sum]; };
这道题一开始我是用递归的方式求解,但是会超时,因此就改用了动态规划。
下面说一下对于这道题我的理解,动态规划我也不是很熟悉,仅作为参考吧,欢迎指正。
首先说一下这道题主要的思路。
第一,在我们对数组的访问过程中,动态规划数组dp,是不断变化的。
第二,动态数组dp的含义:当我们对数据访问到某个阶段m的时候,dp
的含义就表示,在阶段m这一刻时,到达n的可选方式有dp
种。
针对本道题来说,就是当我对数组访问到第m个的时候,那么这前m-1个数字所能组合成结果n的方式有dp
种。
第三,初始条件dp[0+sum] = 0的含义:当我们没有对数组进行任何访问的时候,我们可以获得总和0的选择有且只有一种,那就是数组中的数我们一个都不选。
相关文章推荐
- leetcode 327. Count of Range Sum 字段和问题 + 动态规划DP解决 + 字段数 + 暴力求解真好
- 【LeetCode】007.Reverse Integer - javascript求解
- leetcode:Interleaving String 使用动态规划求解的java源代码
- [leetcode] 518. Coin Change 2 -- JavaScript 代码【动态规划】
- 动态规划求解最大字段和及其变种问题
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 动态规划求解0/1背包问题
- “十滴水”游戏——求解算法挑战赛:模拟退火,用Javascript跑
- 动态规划求解编辑距离问题(转)
- 动态规划求解最长公共子串问题
- 最大子序列求解 分治法和动态规划
- 子数组最大和 动态规划求解
- 0-1背包问题,动态规划求解
- Java动态规划求解最长公共子串问题
- 算法之美——求解 字符串间最短距离(动态规划)
- 最长公共子序列(动态规划求解)
- JavaScript 语法的原理问题求解
- 动态规划求解资源最优分配问题
- 动态规划求解抛硬币概率问题
- 动态规划 求解 Minimum Edit Distance