• C++
  • 信奥1600最大数组和问题

  • @ 2024-3-23 16:29:41

思路一:暴力枚举 image image

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;

int a[100]={0,-1,-3,3,5,-4,3,2,-2,3,6},n;
int s[100][100],smax=-99999;

int main(){
//	cin>>n;
	n=10;
//	for(int i=1;i<=n;i++)cin>>a[i];
	for(int l=1;l<=n;l++){
		for(int r=l;r<=n;r++){
			for(int i=l;i<=r;i++)s[l][r]+=a[i];
			if(s[l][r]>smax)smax = s[l][r];
		}
	}
	cout<<smax;
	return 0;
}

思路二:暴力优化

思路三:分治

思路四:动态规划递推 image

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;

int a[100]={0,-1,-3,3,5,-4,3,2,-2,3,6},n;
int d[100],smax=-99999;

int main(){
//	cin>>n;
	n=10;
//	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n;i>=1;i--){
		if(d[i+1]<=0){
			d[i]=a[i];
		}else d[i]=a[i]+d[i+1];
	}
	for(int i=1;i<=n;i++){
		if(d[i]>smax)smax=d[i];
	}
	cout<<smax;
	return 0;
}

image

image

作业: 1、写实例代码和注释 2、输出最大数组和的每个数字

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;

int a[100]={0,-1,-3,3,5,-4,3,2,-2,3,6},n;
int d[100],r[100],smax=-99999,maxn;

int main(){
//	cin>>n;
	n=10;
//	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n;i>=1;i--){
		if(d[i+1]<=0){
			d[i]=a[i];
			r[i]=i;
		}else{
			d[i]=a[i]+d[i+1];
			r[i]=r[i+1];
		} 
	}
	for(int i=1;i<=n;i++){
		if(d[i]>smax){
			smax=d[i];
			maxn=i;
		}
	}
	cout<<smax<<endl;
	for(int i=maxn;i<=r[maxn];i++){
		cout<<a[i]<<" ";
	}
	return 0;
}

0 条评论

目前还没有评论...