入门动态规划算法

文章目录

理论部分

1.定义:
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。

2.基本思想
该方法主要应用于最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规划找出其中最优(最大或最小)值的解。若存在若干个取最优值的解的话,它只取其中的一个。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解
通俗的就是:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,**前一子问题的解,为后一子问题的求解提供了有用的信息。**在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

3.通过实例引出动态规划解法
在这里插入图是 是发
传统的解法:
通过递归求解

#include <iostream>
#include <algorithm> //引入算法库
int maxsum(int i, int j);
using namespace std;
int n;//定义总行数
const int index = 100;
int a[100][100];
void main()
{
	cout << "请输入三角形" << endl;
	int i,j;
	cin >> n;
	for(i=1;i<=n;i++)
		for (j = 1;j <= i; j++)
		{
			//a[i][j] << cin;  这种不行
			cin >> a[i][j];
		}
	cout <<maxsum(1,1)<<endl;
	return 0;
	
}
int maxsum(int i, int j)
{
	if (i == n)
		return a[i][j];
	//else
	
		int x = maxsum(i + 1, j);//理解递归问题很关键
		int y = maxsum(i + 1, j + 1);
	
	//return max(x,y) + a[i][j];

}

若对递归不理解,请参见我的另一篇博文,递归理解
由于当n过大时,复杂度很多,因而使用动态规划求解。
代码:

#include <iostream>
#include <algorithm> //引入算法库

int maxsum(int i, int j);
using namespace std;
int n;//定义总行数
const int index = 100;
int a[100][100];
int max_sum[100][100];
int main()
{
	cout << "请输入三角形" << endl;
	int i, j;
	cin >> n;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= i; j++)
		{
			cin >> a[i][j];
			max_sum[i][j] = -1; //当其值为-1,表示还没有被遍历过
		}
	cout << maxsum(1, 1) << endl;
	return 0;

}
int maxsum(int i, int j)
{
	if (max_sum[i][j] != -1)
	{
		return max_sum[i][j];
	}
	if (i == n)
		return a[i][j];
	

	int x = maxsum(i + 1, j);//理解递归问题很关键
	int y = maxsum(i + 1, j + 1);
	max_sum[i][j] = max(x, y) + a[i][j];

	return max(x, y) + a[i][j];

}

总结:1.递归到动态规划的转变方法
如果该递归函数有n个参数,那么就定义一个n维数组,数组下标是递归函数参数的取值范围(也就是数组每一维的大小).数组元素的值就是递归函数的返回值(初始化为一个标志值,表明还未被填充),这样就可以从边界值开始逐步的填充数组。

2.动态规划求解一般思路:

发布了34 篇原创文章 · 获赞 18 · 访问量 5123

猜你喜欢

转载自blog.csdn.net/qq_43786066/article/details/104200094
今日推荐