简单动态规划(真的简单)

简单动态规划(Dynamic Programming)

引入

该部分举例来源于中国大学MOOC:浙江大学《数据结构》

在解决一些最优解问题时,我们经常会需要进行动态规划的求解,以期望避免暴力搜索消耗的超长时间.
我们先来看一个最简单的例子.

现有一个每个值都已经确定的数列an,定义子数列为从这个数列中抽取的任意1~n个元素,按相对顺序不变的条件组成的一个新数列.
例如,对于数列(9,8,3,9,2,6),其一个子列可以是(9),(3),(9,8,6),(9,8,3,9,2),等等. 而(3,8)不属于其子列.
现在,求一个由an中任意个连续元素构成的子列的最大和.
输入:输入包含两行,第一行是一个整数,表示数列的长度n.第二行是n个数,表示这个数列的各个值.
输出:输出包含一个数,表示其最大的一个连续子列的和.
测试用例保证1≤n≤100000(105).
时间限制:1000ms
输入样例
8
1 4 -1 -5 8 0 3 1
输出样例
12

解释:从数列中抽取8,0,3,1这四个连续元素构成的子列有最大和12.

如何求解?首先想到暴力搜索:遍历求出所有子列的和,找到最大值.
C/C++代码如下:

#define MAXN 100001
int a[MAXN];
int main()
{
   
   
	int n = 0;
	scanf("%d", &n);
	int ans = 0;//存最终答案
	for(int i = 0; i < n; ++i) scanf("%d", &a[i]);//输入数列
	for(int len = 1; len <= n; ++len)//按数列的长度遍历.
	{
   
   
		for(int i = 0; i + len - 1 < n; ++i)//求出所有长度
		{
   
   									//为len的子列的和.
			int sum = 0;
			for(int j = i; j <= len + i - 1; ++j)
				sum += a[j
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值