利用简单的 最大部分和 算法题搞清楚动态规划的核心思想

这篇文章介绍了如何使用动态规划方法解决一个关于给定整数数组中找到最大连续部分和的问题,通过维护一个数组dp来记录每个位置的最大和。示例展示了如何在C++代码中实现这一算法,用于2014年江苏省青少年信息学奥林匹克竞赛复赛.
摘要由CSDN通过智能技术生成

1589 - 最大部分和(连续部分和)
题目描述

有 n 个整数(1≤n≤100),排成一排,例如:

n=7
−2 13 12 9 14−10 2 (7个整数)

其最大的部分和为 4848 (即 13+12+9+1413+12+9+14)。

输入

第一行一个整数 n;

第二行 n个整数 xi​(−100≤xi​≤100);

第二行的数之间有一个空格;

输出

一个整数(即最大的连续的部分和)。

样例

输入

7
-2 13 12 9 14 -10 2 


输出

48

【来源】

2014江苏省青少年信息学奥林匹克竞赛复赛。

#include<iostream>
using namespace std;

int a[110], dp[110], n;

int main()
{
	int i,sum=0;
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (i = 1; i <= n; i++)
	{
		dp[i] = max(a[i], dp[i - 1] + a[i]);//利用dp数组存储从每个i坐标开始的最大值
		//若加上ai不如ai本身大,说明前面的求和已经是负收益了,
		//如果再和ai求和的话,会拖累ai这么好的一个材料,
		//则dpi改为ai的数值
		//dpi大于ai的情况下,不能仅仅因为ai是一个负数,
		//就不加了,因为后面可能会迎来转机(能够加上后弥补ai是个负数的不足,
		//即ai+1和ai求和的结果又是个正数,则把它俩一块加上后就又是正收益了)
		sum = max(dp[i], sum);//反悔操作
		//如果在dpi大于ai的情况下,加上ai及ai后面的数都不如不加的大
		//(及ai和后面任意数求和的结果都是负数,那么带上ai就是负收益了)
		//此时进行反悔,回到最辉煌的时候
	}
	cout << sum;
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值