动态规划(自底向上)

动态规划 – 求解二项式系数(自顶向下,自底向上)

ref from  http://jarg.iteye.com/blog/859391

博客分类:
算法设计
Pascal
J#

《动态规划(自底向上)》

1. 动态规划 备忘录法

备忘录方法采用自顶向下方式,为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

说明: 在非边界条件下,每次求解子问题时,先查找备忘录.

若子问题已经求解过了,直接取出子问题的解;若未求解过,则求解并保存到备忘录中.

此处的备忘录就是一个存储数据的容器.

Java代码

《动态规划(自底向上)》

  1. /*
  2. @author: jarg
  3. @TODO 动态规划 – 备忘录法 求解二项式系数
  4. */
  5. /* 求解二项式系数 */
  6. public staticint Binomial(int n,int m)
  7. {
  8. /* 边界条件 */
  9. if(n==m || m==0)
  10. {
  11. return 1;
  12. }
  13. int date = readDate(n,m);
  14. if(date>0)
  15. {
  16. /*
  17. 子问题已经计算过
  18. 读取保存在备忘录中的数据
  19. */
  20. return date;
  21. }
  22. else
  23. {
  24. /*
  25. 子问题未计算过
  26. 解出子问题,将数据保存在备忘录中
  27. */
  28. int result = Binomial(n-1,m) + Binomial(n-1,m-1);
  29. writeDate(n,m,result);
  30. return result;
  31. }
  32. }
  33. /* 从备忘录中读取数据 */
  34. public staticint readDate(int n,int m)
  35. {
  36. for(int i=0;i<demo.size();i++)
  37. {
  38. Map<String,Integer> date = new HashMap<String,Integer>();
  39. date = demo.get(i);
  40. if(date.get(“” + n + m) !=null)
  41. {
  42. return date.get(“” + n + m);
  43. }
  44. }
  45. return 0;
  46. }
  47. /* 向备忘录中写入数据 */
  48. public staticvoid writeDate(int n,int m,int value)
  49. {
  50. Map<String,Integer> date = new HashMap<String,Integer>();
  51. date.put(“” + n + m,value);
  52. demo.add(date);
  53. }
/*
@author: jarg
@TODO 动态规划 - 备忘录法 求解二项式系数
*/

/* 求解二项式系数 */
public static int Binomial(int n,int m)
{
	/* 边界条件 */
	if(n==m || m==0)
	{
		return 1;
	}

	int date = readDate(n,m);
	if(date>0)
	{
		/*
		子问题已经计算过
		读取保存在备忘录中的数据
		*/
		return date;
	}
	else
	{
		/*
		子问题未计算过
		解出子问题,将数据保存在备忘录中
		*/
		int result = Binomial(n-1,m) + Binomial(n-1,m-1);
		writeDate(n,m,result);
		return result;
	}
}

/* 从备忘录中读取数据 */
public static int readDate(int n,int m)
{
	for(int i=0;i<demo.size();i++)
	{
		Map<String,Integer> date = new HashMap<String,Integer>();
		date = demo.get(i);
		if(date.get("" + n + m) != null)
		{
			return date.get("" + n + m);
		}
	}
	return 0;
}

/* 向备忘录中写入数据 */
public static void writeDate(int n,int m,int value)
{
	Map<String,Integer> date = new HashMap<String,Integer>();
	date.put("" + n + m,value);
	demo.add(date);
}

2. 动态规划 迭代法:

迭代法采用自底向上方式,保存已求解的子问题,需要时取出,消除对某些子问题的重复求解.

Pascal三角形:
《动态规划(自底向上)》

说明: 在非边界的情况下,二项式系数=上一行同列数值+上一行同列前一个数值.

为了节省空间,根据n的大小,定义长度为n+1的整型数组,用以存储子问题的解.

从后往前计算图中二项式系数的解,完成后,将问题解存储在数组中对应的列标号位置.

Java代码

《动态规划(自底向上)》

  1. /*
  2. @author: jarg
  3. @TODO: 动态规划 – 求解二项式系数
  4. */
  5. /* 求二项式系数 */
  6. public staticint binomial(int n,int m)
  7. {
  8. int value[] = newint[n+1];
  9. for(int i=0;i<=n;i++)
  10. {
  11. value[i] = 1;
  12. /* 边界条件m=0,n=m的情况 */
  13. for(int j=i-1;j>0;j–)
  14. {
  15. value[j] = value[j] + value[j-1];
  16. }
  17. }
  18. return value[m];
  19. }
    原文作者:动态规划
    原文地址: https://blog.csdn.net/robotcat123/article/details/9381503
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞