动态规划(自底向上)


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. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值