当前位置:   article > 正文

C# 动态规划(Dynamic Programming)-1

c# 动态规划

动态规划算法

     动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。动态规划和分治法相似,都是通过组合子问题的解来求解原问题。分治法将问题划分成互不相交的子问题,递归求解子问题,再将他们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。在这种情况下,分治算法会做出许多不必要的工作,它会反复的求解那些公共子问题。而动态规划算法对每个子子问题只求解一次,将结果保存到表格中,从而无需每次求解一个子子问题都要重新计算。

 钢条切割问题:

长度 i

1

2

3

4

5

6

7

8

9

10

价格p[i]

1

5

8

9

10

17

17

20

24

30

 常规递归方法:

  1. internal class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. int n = 5;//要切割的钢条长度
  6. int[] price = { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 };//数值=价格,索引=钢条长度
  7. Console.WriteLine(MaxPrice(0,price));
  8. Console.WriteLine(MaxPrice(1,price));
  9. Console.WriteLine(MaxPrice(2,price));
  10. Console.WriteLine(MaxPrice(3,price));
  11. Console.WriteLine(MaxPrice(4,price));
  12. Console.WriteLine(MaxPrice(5,price));
  13. Console.WriteLine(MaxPrice(6,price));
  14. Console.WriteLine(MaxPrice(7,price));
  15. Console.WriteLine(MaxPrice(8,price));
  16. Console.WriteLine(MaxPrice(9,price));
  17. Console.WriteLine(MaxPrice(10,price));
  18. }
  19. public static int MaxPrice(int n, int[] p)
  20. {
  21. if (n == 0) return 0;
  22. int tempMaxPrice = 0;
  23. for(int i = 1; i < n+1; i++)
  24. {
  25. int maxPrice = p[i]+MaxPrice(n-i, p);
  26. if(maxPrice > tempMaxPrice)
  27. {
  28. tempMaxPrice = maxPrice;
  29. }
  30. }
  31. return tempMaxPrice;
  32. }
  33. }

 动态规划-自顶向下法:

  1. internal class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. int n = 5;//要切割的钢条长度
  6. int[] memory = new int[11];
  7. int[] price = { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 };//数值=价格,索引=钢条长度
  8. Console.WriteLine(MaxPrice(0, price, memory));
  9. Console.WriteLine(MaxPrice(1, price, memory));
  10. Console.WriteLine(MaxPrice(2, price, memory));
  11. Console.WriteLine(MaxPrice(3, price, memory));
  12. Console.WriteLine(MaxPrice(4, price, memory));
  13. Console.WriteLine(MaxPrice(5, price, memory));
  14. Console.WriteLine(MaxPrice(6, price, memory));
  15. Console.WriteLine(MaxPrice(7, price, memory));
  16. Console.WriteLine(MaxPrice(8, price, memory));
  17. Console.WriteLine(MaxPrice(9, price, memory));
  18. Console.WriteLine(MaxPrice(10, price, memory));
  19. }
  20. public static int MaxPrice(int n, int[] p,int[] memory)
  21. {
  22. if (n == 0) return 0;
  23. if (memory[n] != 0)
  24. {
  25. return memory[n];
  26. }
  27. int tempMaxPrice = 0;
  28. for (int i = 1; i < n + 1; i++)
  29. {
  30. int maxPrice = p[i] + MaxPrice(n - i, p,memory);
  31. if (maxPrice > tempMaxPrice)
  32. {
  33. tempMaxPrice = maxPrice;
  34. }
  35. }
  36. memory[n] = tempMaxPrice;
  37. return tempMaxPrice;
  38. }
  39. }

动态规划-自底向上法:

  1. internal class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. int[] memory = new int[11];
  6. int[] price = { 0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30 };//数值=价格,索引=钢条长度
  7. Console.WriteLine(MaxPrice(0, price, memory));
  8. Console.WriteLine(MaxPrice(1, price, memory));
  9. Console.WriteLine(MaxPrice(2, price, memory));
  10. Console.WriteLine(MaxPrice(3, price, memory));
  11. Console.WriteLine(MaxPrice(4, price, memory));
  12. Console.WriteLine(MaxPrice(5, price, memory));
  13. Console.WriteLine(MaxPrice(6, price, memory));
  14. Console.WriteLine(MaxPrice(7, price, memory));
  15. Console.WriteLine(MaxPrice(8, price, memory));
  16. Console.WriteLine(MaxPrice(9, price, memory));
  17. Console.WriteLine(MaxPrice(10, price, memory));
  18. }
  19. public static int MaxPrice(int n, int[] p, int[] memory)
  20. {
  21. for (int i = 1; i < n + 1; i++)
  22. {
  23. //钢条长度为i时最大收益
  24. int tempMaxPrice = 0;
  25. for(int j = 1; j < i+1; j++)
  26. {
  27. int maxPrice = p[j] + memory[i-j];
  28. if (maxPrice > tempMaxPrice)
  29. {
  30. tempMaxPrice = maxPrice;
  31. }
  32. }
  33. memory[i] = tempMaxPrice;
  34. }
  35. return memory[n];
  36. }
  37. }

 结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/161946
推荐阅读
  

闽ICP备14008679号