四、算法_动态规划
来源:互联网 发布:宋松淘宝模特 编辑:程序博客网 时间:2024/05/20 05:07
动态规划
- 自顶向下递归
- 自底向上
动态规划与分治法类似
自顶向下递归C#实现:
// 自顶向下递归 - 钢条切割 class Program { static void Main (string[] args) { // 出售长度 int n = 5; int[] pPrices = new[] { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 }; Console.WriteLine(BuyUpDown(0,pPrices)); Console.WriteLine(BuyUpDown(5, pPrices)); Console.ReadKey(); } public static int BuyUpDown (int n, int[] pPrices) { if (n == 0) { return 0; } int pTempMaxPrice = 0; for (int i = 1; i < n + 1; i++) { int pMaxPrices = pPrices[i] + BuyUpDown(n - i, pPrices); if (pMaxPrices > pTempMaxPrice) { pTempMaxPrice = pMaxPrices; } } return pTempMaxPrice; } }
缺点:性能低,效率低。
动态规划(带备忘)的自顶向下的实现:
对计算的结果进行保存,避免进行二次运算,但是要付出空间带价。
class Program { static void Main (string[] args) { // 出售长度 //int n = 5; int[] pPrices = new[] { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 }; int[] pResult = new int[pPrices.Length+1]; Console.WriteLine(BuyUpDown(0, pPrices, pResult)); Console.WriteLine(BuyUpDown(5, pPrices, pResult)); Console.ReadKey(); } public static int BuyUpDown (int n, int[] pPrices, int[] pResult) { if (n == 0) { return 0; } if (pResult[n] != 0) { return pResult[n]; } int pTempMaxPrice = 0; for (int i = 1; i < n + 1; i++) { int pMaxPrices = pPrices[i] + BuyUpDown(n - i, pPrices, pResult); if (pMaxPrices > pTempMaxPrice) { pTempMaxPrice = pMaxPrices; } } pResult[n] = pTempMaxPrice; return pTempMaxPrice; } }
自底向上:小问题依次解决大问题。
class Program { static void Main (string[] args) { // 出售长度 int[] pPrices = new[] { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 }; int[] pResult = new int[pPrices.Length + 1]; Console.WriteLine(BottomUp(0,pPrices,pResult)); Console.WriteLine(BottomUp(1, pPrices, pResult)); Console.ReadKey(); } public static int BottomUp (int n, int[] pPrices, int[] pResult) { for (int i = 1; i < n + 1; i++) { // 取得长度为 i 的最大收益 int pTempMaxPrices = -1; for (int j = 1; j <= i; j++) { int pMaxPrices = pPrices[j] + pResult[i - j]; if (pMaxPrices > pTempMaxPrices) { pTempMaxPrices = pMaxPrices; } }//End for j pResult[i] = pTempMaxPrices; }//End for i return pResult[n]; }// End BottomUp }
0 0
- 四、算法_动态规划
- 算法_动态规划总结
- 算法设计_动态规划
- 算法_动态规划_货币兑换
- 算法_动态规划_图像压缩
- 算法_动态规划_电路布线
- 算法_动态规划_流水作业调度
- 算法_动态规划_漂亮打印
- 算法学习_分治算法、动态规划
- 基础算法(四)---动态规划算法
- 动态规划_动态规划算法的优化技巧
- 算法之道_流水线装配问题_动态规划
- 蓝桥杯_算法提高_金属采集(树形动态规划)
- 蓝桥杯_算法提高_概率计算(动态规划)
- 算法_动态规划_最长单调递增子序列
- 算法_动态规划_矩阵路径最大和
- 算法_动态规划_整数线性规划问题
- 算法_动态规划_二维01背包问题
- 共用体练习
- 判断手机号 h5
- 下载OSM地图数据并导入至postgreSQL数据库中(Ubuntu16.04LTS)
- 编写一个函数实现n^k,使用递归实现
- Memory Management (DXE) 实例分析
- 四、算法_动态规划
- android 动画
- 简单枚举类型——植物与颜色
- linux 搭建git远程库
- BZOJ 1898 构造矩阵+矩阵快速幂
- 数据可视化相关内容
- javascript match方法获取url参数的正则表达式(用来获取某个参数值)很重要!!!!!
- 【leetcode】121. Best Time to Buy and Sell Stock【java】
- linux搭建svn版本控制器