順序表應用7:最大子段和之分治遞迴法
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
一行輸出兩個整數,之間以空格間隔輸出:
第一個整數為所求的最大子段和;
第二個整數為用分治遞迴法求解最大子段和時,遞迴函式被呼叫的總次數。
Sample Input
6 -2 11 -4 13 -5 -2
Sample Output
20 11
Hint
Source
在做這個題的時候遇到了一個坑點,for迴圈是逐步擴大的,中心點為mid,要從mid向兩側擴充套件。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define Max 100001
using namespace std;
int count;
int data[Max];
int max(int a,int b){
return a > b ? a : b;
}
int handle(int l,int r){
count++;
if(l == r){
return data[l];
}
int a = 0,b = 0,c = 0;
int num1 = 0,num2 = 0;
int mid = (l + r) / 2;
for(int i = mid - 1; i >= l ;i--){
//i = l ; i <= mid - 1;i++
num1 += data[i];
a = max(a,num1);
}
for(int i = mid + 1; i <= r; i++){
num2 += data[i];
b = max(b,num2);
}
c = max(c, data[mid] + a + b);
c = max(c, handle(l, mid));
c = max(c, handle(mid + 1, r));
//cout << c << " " << count << endl;
return c;
}
int main(){
ios::sync_with_stdio(false);
int a;
cin >> a;
int temp;
for(int i = 0 ; i < a ; i++){
cin >> temp;
data[i] = temp;
//cout << data[i] << endl;
}
int max = handle(1,a);
cout << max << " " << count << endl;
}
相關文章
- 順序表應用8:最大子段和之動態規劃法動態規劃
- 【LeetCode】【分治法】連續數列(最大子序和)思路解析和程式碼LeetCode
- 順序表應用5:有序順序表歸併
- 順序表應用6:有序順序表查詢
- 分治法 && 動態規劃 洛谷P1115 最大子段和動態規劃
- 遞迴、分治和動態規劃遞迴動態規劃
- 20200925—遞迴與分治遞迴
- 順序表應用3:元素位置互換之移位演算法演算法
- 《演算法筆記二》連結串列、棧、佇列、遞迴、雜湊表、順序表演算法筆記佇列遞迴
- 順序表應用1:多餘元素刪除之移位演算法演算法
- 順序表應用4:元素位置互換之逆置演算法演算法
- 動態規劃求解最大子段和 (兩種寫法+還原最優解)動態規劃
- 順序表
- 遞迴 & 分治演算法深度理解遞迴演算法
- 歸併排序(C++_分治遞迴)排序C++遞迴
- 遞迴與分治之大整數乘法遞迴
- 順序表應用2:多餘元素刪除之建表演算法演算法
- leetcode_最大子序和LeetCode
- 不同順序InBoundHandler之間的資料傳遞
- 遞迴與分治演算法練習遞迴演算法
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列
- 【51nod】最大子段和
- 實驗二:順序表的基本操作實現及其應用
- 非遞迴實現先序遍歷和中序遍歷遞迴
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- 第2章 順序表及其順序儲存
- 線性表之順序儲存結構
- 山海經:線段樹維護最大子段和
- 遞迴和尾遞迴遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 遞迴的應用場景和呼叫機制、遞迴需要遵守的重要規則遞迴
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- CDQ分治和三維偏序
- 53. 最大子序和(python3)Python
- 程式流程 (順序,選擇,迴圈)
- 順序表的學習
- 順序表的實現
- Java實現順序表Java