动态规划-最大子数组

题目:

给定一个整数数组,找出和最大的子数组,返回其和。例如,(1,-2,3,5,-1,2)最大子数组(3,5,-1,2),和为9.

分析:

     利用动态规划,记Sum[i]表示以A[i]结尾的子数组中的和最大子数组。Sum[i+1]呢?
      考虑Sum[i]的情况,若Sum[i]>0(即Sum[i]+A[i+1]>A[i+1]),则Sum[i+1]=Sum[i]+A[i+1];
      若Sum[i]<0(即Sum[i]+A[i+1]<A[i+1])则Sum[i+1]=A[i+1];当然,相等时取任意一个即可。
      由此可知,Sum[i+1]=max(Sum[i]+A[i+1],A[i+1]);
MaxSubArr(int A[], int &n)参数:数组A,数组大小n。时间复杂度:O(n)

代码:

//查找最大子数组函数 
int MaxSubArr(int A[],int &n)
{
	int Sum;
	Sum = A[0];
	for (int i = 1;i < n;i++)
		Sum = max(Sum + A[i], A[i]);
	return Sum;
}

全部代码:

/*
Project: dp_muxSubArr
Date:    2018/01/03
Author:  Frank Yu
题目:给定一个整数数组,找出和最大得的子数组,返回其和。例如,(1,-2,3,5,-1,2)最大子数组(3,5,-1,2),和为9.
分析:利用动态规划,记Sum[i]表示以A[i]结尾的子数组中的和最大子数组。Sum[i+1]呢?
      考虑Sum[i]的情况,若Sum[i]>0(即Sum[i]+A[i+1]>A[i+1]),则Sum[i+1]=Sum[i]+A[i+1];
	  若Sum[i]<0(即Sum[i]+A[i+1]<A[i+1])则Sum[i+1]=A[i+1];当然,相等时取任意一个即可。
	  由此可知,Sum[i+1]=max(Sum[i]+A[i+1],A[i+1]);
MaxSubArr(int A[], int &n)参数:数组A,数组大小n。时间复杂度:O(n)
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MaxSize 100
#define Status int
using namespace std;
int n = 0;
int A[MaxSize];
//***************************基本操作函数*******************************//
//初始化数组函数,构造一个空的数组 
Status InitArray(int A[])
{
	memset(A, 0, sizeof(A));//初始化数据为0
	return 0;
}
//创建数组函数 初始化前n个数据
bool CreatArray(int A[], int &n)
{
	if (n<0 || n>MaxSize)false;//n非法
	for (int i = 0;i<n;i++)
	{
		scanf_s("%d", &A[i]);
	}
	return true;
}
//查找最大子数组函数 
int MaxSubArr(int A[],int &n)
{
	int Sum;
	Sum = A[0];
	for (int i = 1;i < n;i++)
		Sum = max(Sum + A[i], A[i]);
	return Sum;
}
//********************************功能函数*****************************************//
//输出功能函数 按位置从小到大输出数组所有元素
void PrintArray(int A[], int &n)
{
	printf("当前数组所有元素:");
	for (int i = 0;i<n;i++)
	{
		printf("%d ", A[i]);
	}
	printf("\n");
}
//创建数组函数
void Create(int A[], int &n)
{
	bool flag;
	printf("请输入要创建的数组长度(>1):");
	scanf_s("%d", &n);
	printf("请输入%d个数(空格隔开):", n);
	flag = CreatArray(A, n);
	if (flag) {
		printf("创建成功!\n");
		PrintArray(A, n);
	}
	else printf("输入长度非法!\n");

}
//寻找最大子数组 
void Find_MaxSubArr(int A[], int n)
{
	int max;
	if (0 == n) printf("最大子数组为:0\n");
	else
	{
		max = MaxSubArr(A,n);
		printf("最大子数组为:%d\n", max);
	}
}
//菜单
void menu()
{
	printf("********1.创建    2.返回最大子数组*********\n");
	printf("********3.退出\n");
}

int main()
{
	int choice;
	InitArray(A);
	while (1)
	{
		menu();
		printf("请输入菜单序号:\n");
		scanf_s("%d", &choice);
		if (3 == choice) break;
		switch (choice)
		{
		case 1:Create(A, n);break;
		case 2:Find_MaxSubArr(A, n);break;
		default:printf("输入错误!!!\n");
		}
	}
	return 0;
}

运行截图:

标题

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值