time limit: 10 ms memory limit: 400 kib
submit
statistic
problem description
給定n(1<=n<=50000)個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: max,1<=i<=j<=n。 例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20。
注意:本題目要求用分治遞迴法求解,除了需要輸出最大子段和的值之外,還需要輸出求得該結果所需的遞迴呼叫總次數。
#include
int count=0;
int main()
int fib(int n)
input
第一行輸入整數n(1<=n<=50000),表示整數序列中的資料元素個數;
第二行依次輸入n個整數,對應順序表中存放的每個資料元素值。
output
一行輸出兩個整數,之間以空格間隔輸出:
第乙個整數為所求的最大子段和;
第二個整數為用分治遞迴法求解最大子段和時,遞迴函式被呼叫的總次數。
sample input
6
-2 11 -4 13 -5 -2
sample output
20 11
hint
source
終於做對了媽呀。用c++的輸入輸出就超時,有沒有大佬解答一下呀???
思路:計算出一整部分元素和的最大值,然後再計算中間元素左邊的元素和的最大值,再計算右邊元素和的最大值,然後進行比較取最大值。計算左右兩邊和的最大值時跟上述步驟相同,直到僅剩乙個元素為止
#include using namespace std;
int cnt;
int getmax(int s, int l, int r)
else
}int leftmax, rightmax, max;
int mid;
mid = (l+r)/2;
leftmax = getmax(s,l,mid);
rightmax = getmax(s,mid+1,r);
int suml, sumr, sum;
int i;
sum = 0;
suml = 0;
for(i = mid; i >= l; i--)
}sum = 0;
sumr = 0;
for(i = mid+1; i <= r; i++)
}max = suml + sumr;
max = max(max,leftmax);
max = max(max,rightmax);
return max;
}int main()
sum = getmax(s,0,n-1);
printf("%d %d\n",sum, cnt);
return 0;
}
分治演算法 順序表應用7 最大子段和之分治遞迴法
problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 ...
順序表應用7 最大子段和之分治遞迴法
time limit 10ms memory limit 400kb problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定...
順序表應用7 最大子段和之分治遞迴法
problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。例如,當 a 1 a 2 ...