給定n個整數(可正可負)a0,
a1,.
..an
−1
a_0, a_1, ... a_
a0,a1
,..
.an−
1,求它們的最大連續和。
s 0=
0,si
=∑j=
0i−1
aj(1
≤i≤n
)s_0 = 0, s_i = \sum_^ in)}
s0=0,
si=
j=0∑
i−1
aj(
1≤i≤
n) 可以得到原序列的累加量序列s0,
s1,.
..sn
s_0, s_1, ... s_n
s0,s1
,..
.sn
。這樣原序列的任意連續和都可以表示為sj−
si(0
≤i
n)
s_j-s_i (0isj
−si
(0≤
in),找出最大的sj−
si
s_j-s_i
sj−si
即可。
二重迴圈遍歷i
ii 和 j
jj,更新最大的sj−
si
s_j-s_i
sj−si
。 對於確定的j
jj,sj−
si
s_j-s_i
sj−si
最小等價於si(
0≤
i
s_i(0isi
(0≤
i。因此,只需要一重迴圈,遍歷j
jj的同時維護目前為止最小的s
is_i
si值,更新最大的sj−
si
s_j-s_i
sj−si
。 題目maximum profit選自aizu-alds1_1_d,內容如下:
write a program which reads values of a currency r**如下:tr_t
rt at a certain time ttt(
t=0,
1,2,
...n
−1
)(t=0,1,2,...n−1)
(t=0,1
,2,.
..n−
1), and reports the maximum value of rj−
ri
r_j−r_i
rj−ri
where j
>
ij>i
j>i .
input
the first line contains an integer n. in the following n lines, r
tr_t
rt (t=
0,1,
2,..
.n−1
)(t=0,1,2,...n−1)
(t=0,1
,2,.
..n−
1)are given in order.
output
print the maximum value in a line.
constraints
sample input 1
sample output 1653
1343
3
//
#include
#include
using
namespace std;
const
int min_num =
-2000000000
;//定義足夠小的常數,用於取max
int n, ans;
intmain()
cur_min =
min(cur_min, rt)
;//維護當前量之前的最小值
} cout << ans << endl;
return0;
}
最大連續和
這個問題對我來說還挺難的,當初做dp時水過去了,但沒徹底理解,這次打算好好分析一下,爭取徹底搞懂。首先,像 1 1 2 2 3 3 4 4 5 5這樣的數列,想要找連續最大和,可以有很多種方法,從最慢的列舉o n 3 到最快的動態規劃o n 毫無疑問,我們要選擇複雜度低的演算法。所以我這裡就只分析兩...
最大連續和
求陣列中數的最大連續和,如 1,1,1,1,1 最大連續和為3 一 動態規劃 當我們從頭到尾遍歷這個陣列的時候,對於陣列裡的乙個整數,它有幾種選擇呢?它只有兩種選擇 1 加入之前的subarray 2.自己另起乙個subarray。那什麼時候會出現這兩種情況呢?設狀態為f j 表示以s j 結尾的最...
最大連續和
給出乙個長度為n的序列a1,a2,an,求最大連續和 使用列舉 時間複雜度o n 3 best a 1 初始最大值 for int i 1 i n i 設si a1 a2 ai,則ai ai 1 aj sj si 1 連續子串行的和等於兩個字首之差 時間複雜度o n 2 s 0 0 for int ...