最大子段和问题

最大子段和问题

蛮力法、分治法

#include
#include
#include 
using namespace std;
int force(int num[],int n); 
int dcm(int num[],int left,int right); 
int main(void)
{ 
	cout<<"请输入整数n,表示将输入n个数的序列"; 
	int n;
	cin>>n;
	int num[n]; 
	cout<<"请逐一输入n个整数"; 
	for(int i=0;i>num[i];   
	} 
	cout<<"分治法计算出最大子段和为:"<::min(); 
	 for(int i=0;i=left;i--)
		{
			lefts+=num[i];
			if(lefts>s1)s1=lefts; 
		} 
		s2=rights=0;
		for(int j=center+1;j<=right;j++)
		{
			rights+=num[j];
			if(rights>s2)s2=rights; 
		} 
		midsum=s1+s2;
		sum=max(leftsum,max(midsum,leftsum)); 
	} 
	return sum; 
} 

 最大子段和问题_第1张图片

动态规划

在本题中,开dp数组,dp[i]表示以第i个数结尾的字段和的最大值。

状态转移方程:

dp[i]=max(dp[i-1]+sq[i],sq[i]);

//状态转移方程,取最大值 以i结尾时i独立成段 和 i不独立成段

根据上述方程计算dp数组,当然还要求得dp数组中的最大值作为最终值,是对result=max(result,dp[i]);进行循环求值,最后返回result。

程序中,也在决策时进行了记录,如

if(dp[i]==dp[i-1]+sq[i])path[i]=i-1;//决策记录,当字段增长时,记录索引

else path[i]=-1;//当字段不在增长时,置为-1

随后根据path数组顺藤摸瓜找出、输出最大字段的各个数。

#include
#include
#include
using namespace std;
int maxsq(int sq[],int n);
int main(void) {
	cout<<"请输入要输入的序列长度:"<>n;
	int sq[n];//序列数组
	for(int i=0; i>sq[i];
	}
	cout<::min();//先置为最小值
	if(n==0)return 0;//序列长度为0,返回0
	else if(n==1)return sq[0];//序列长度为1,返回序列第一个值sq[0]
	else {//其他
		int path[n];//路径索引决策数组,记录决策路径信息
		int dp[n];//dp数组,dp[i]表示以第i个数结尾的字段和的最大值
		dp[0]=sq[0];//初始条件
		for(int i=1; i::min();//首先置为最小
			dp[i]=max(dp[i-1]+sq[i],sq[i]);//状态转移方程,取最大值 以i结尾时i独立成段 和 i不独立成段
			if(dp[i]==dp[i-1]+sq[i])path[i]=i-1;//决策记录,当字段增长时,记录索引
			else path[i]=-1;//当字段不在增长时,置为-1
		}
		int p;//指向最大字段和字段结尾数字序列
		for(int i=0; i-1; i--) {
			cout<

 最大子段和问题_第2张图片

 

你可能感兴趣的:(数据结构与算法)