Maximum Subsequence Sum (25)/动态规划dp

题目描述

在这里插入图片描述

思路解析

见我的令一篇博文:https://blog.csdn.net/weixin_43590232/article/details/104152766

AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10005;
int a[maxn];
int main() {
	int n;scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	int left=0,right=n-1,opt=a[0];
	// dp[i]=max(dp[i-1]+a[i],a[i]);
	int dp=a[0],tleft=0, tright=0;
	for(int i=1;i<n;i++){
		if(dp+a[i]>a[i]) {
			dp=dp+a[i];
			tright=i;
		}
		else{
			dp=a[i];
			tleft=i;tright=i;
		}
		if(dp>opt){
			opt=dp;
			left=tleft;right=tright;
		}
	}
	if(opt<0){
		opt=0;left=0;right=n-1;
	}
	printf("%d %d %d",opt,a[left],a[right]); 
	return 0;
}

暴力法

由于本题的规模不太大,直接用暴力法也不会时间超限。
关于最大能承受的问题规模,可以看:

https://blog.csdn.net/weixin_43590232/article/details/104155591

#include<iostream>
using namespace std;
int in[10005];
bool flag;
int main() {
	int k; cin >> k;
	for (int i = 0; i < k; i++) {
		cin >> in[i];
		if (in[i] >= 0) flag = true;
	}
	if (flag == false) {
		printf("0 %d %d", in[0], in[k - 1]);
		return 0;
	}
	int maxs = -1,a,b;
	for (int i = 0; i < k; i++) {
		//if (in[i] < 0) continue;
		int sum = 0;
		for (int j = i; j < k; j++) {
			sum += in[j];
			if (sum > maxs) {
				maxs = sum;
				a = in[i]; b = in[j];
			}
		}
	}
	printf("%d %d %d", maxs, a, b);
	return 0;
}
发布了62 篇原创文章 · 获赞 7 · 访问量 3122

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104157601