顺序表应用7:最大子段和之分治递归法
来源:互联网 发布:手机怎么绑定淘宝小号 编辑:程序博客网 时间:2024/06/10 04:46
Problem Description
给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
注意:本题目要求用分治递归法求解,除了需要输出最大子段和的值之外,还需要输出求得该结果所需的递归调用总次数。
递归调用总次数的获得,可以参考以下求菲波那切数列的代码段中全局变量count的用法:
#include
int count=0;
int main()
{
int n,m;
int fib(int n);
scanf("%d",&n);
m=fib(n);
printf("%d %d\n",m,count);
return 0;
}
int fib(int n)
{
int s;
count++;
if((n==1)||(n==0)) return 1;
else s=fib(n-1)+fib(n-2);
return s;
}
Input
第一行输入整数n(1<=n<=50000),表示整数序列中的数据元素个数;
第二行依次输入n个整数,对应顺序表中存放的每个数据元素值。
Output
一行输出两个整数,之间以空格间隔输出:
第一个整数为所求的最大子段和;
第二个整数为用分治递归法求解最大子段和时,递归函数被调用的总次数。
Example Input
6-2 11 -4 13 -5 -2
Example Output
20 11
Hint
#include <iostream>#include <bits/stdc++.h>#define maxsize 50050using namespace std;typedef int element;typedef struct{ element *elem; int length; int listsize;}sq;int intilist(sq*l){ l->elem=(element*)malloc(maxsize*sizeof(element)); if(!l->elem) return -1; l->length=0; l->listsize=maxsize;}void insert(sq*l,int n){ int i; for(i=0;i<n;i++) { scanf("%d",&l->elem[i]); }}int cnt=0,sum=0;int maxsum(sq*l,int s,int h){ cnt++; int i; if(s==h) { if(l->elem[s]>=0) sum=l->elem[s]; else sum=0; } else{ int mid=(s+h)/2; int lsum=maxsum(l,s,mid); int rsum=maxsum(l,mid+1,h); int s1=0,s2=0,ss=0; for(i=mid;i>=s;i--) { ss+=l->elem[i]; if(s1<=ss) s1=ss; } ss=0; for(i=mid+1;i<=h;i++) { ss+=l->elem[i]; if(s2<=ss) s2=ss; } sum=s1+s2; sum=max(lsum,sum); sum=max(rsum,sum);} return sum;}int main(){ int n,su; sq l; scanf("%d",&n); intilist(&l); insert(&l,n); su=maxsum(&l,0,n-1); printf("%d %d\n",su,cnt); return 0;}
- 【分治递归法】顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- SDYTACM 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- 数据结构顺序表应用7:最大子段和之分治递归法
- 顺序表应用7:最大子段和之分治递归法
- Latex中插图总结(一)
- 字符串常量到底存放在哪个存储区
- Http协议解析
- 创建和销毁对象(1)——考虑用静态工厂方法代替构造器
- Android---不注意的小细节
- 顺序表应用7:最大子段和之分治递归法
- Material Design TabLayout篇
- JAVA进阶4.8——Vector和Stack
- java and python学习——第三周leetcode刷题
- 【HDU 5887】Herbs Gathering(dfs+时间剪枝)
- 设置编码为UTF8
- 设计模式之策略模式
- tableview 展示小视频
- 关于安装QT VS2013中我遇到的各种问题