文章

19

粉丝

67

获赞

29

访问

11.6k

头像
动态规划,使用变量保存字段和最大时的开始和结束索引

#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

int main()
{
	int k;
	while (cin >> k)
	{
		if (k == 0)
		{
			break;
		}
		vector<int> nums(k);
		for (int i = 0; i < k; i++)
		{
			cin >> nums[i];
		}
		// dp数组
		vector<ll> dp(k);
		dp[0] = nums[0];
		ll maxx = dp[0];
		// 使用两对变量保存索引
		int beginIndex = 0, maxBegin = beginIndex;
		int endInex = 0, maxEnd = endInex;
		for (int i = 1; i < k; i++)
		{
			// 负增益则前面的子序列抛弃
			if (dp[i - 1] < 0)
			{
				dp[i] = nums[i];
				beginIndex = i;
			}
			// 有增益时不抛弃
			else
			{
				dp[i] = nums[i] + dp[i - 1];
			}
			// 更新保存最大字段和的相关变量
			if (maxx < dp[i])
			{
				maxx = dp[i];
				maxBegin = beginIndex;
				maxEnd = i;
			}
		}
		// 根据题目要求输出全为负数的情况
		if (maxx < 0)
		{
			cout << 0 << " " << nums[0] << " " << nums[k - 1] << endl;
		}
		// 正常输出
		else
		{
			cout <...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发