数据结构之动态规划

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

复杂为f(n);
下面代码为在一个数组中,求一个最大子序列

#include<ctime>
#include<iostream>
using namespace std;
int max(int a, int b)
{
	return a > b ? a : b;
}
int main()
{
	int m, num[200], dp[200],k;//m记录最大值,dp中每个元素都为一个子序列;
	while (cin >> k)
	{
		for (int i = 0; i < k; i++)
			cin >> num[i];
		m = dp[0] = num[0];
		for (int i = 1; i < k; i++)
		{
			if (dp[i - 1] < 0) dp[i] = num[i];//这是代表如果dp[i-1]小于0,即前一个子数列小于零,则创建新序列dp[i];
			else dp[i] = dp[i - 1] + num[i];//如果dp[i-1]》=0,即前一个子序列没有小于0,即可以再加下去;
			m = max(m, dp[i]);//这个判断前一个子序列和新序列的大小值 存入m中;
		}
		cout << m << endl;//遍历完后输入m
	}
}
发布了17 篇原创文章 · 获赞 1 · 访问量 3440

猜你喜欢

转载自blog.csdn.net/weixin_43983570/article/details/90318219