題目描述
給定一個長度為 N 的數(shù)組,數(shù)組中的第 i 個數(shù)字表示一個給定股票在第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
輸入格式
第一行包含整數(shù) N,表示數(shù)組長度。
輸出格式
輸出一個整數(shù),表示最大利潤。
數(shù)據(jù)范圍
1≤N≤105
輸入樣例1
6
7 1 5 3 6 4
輸出樣例1
7
輸入樣例2
5
1 2 3 4 5
輸出樣例2
4
輸入樣例3
5
7 6 4 3 1
輸出樣例3
0
樣例解釋
樣例1:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。共得利潤 4+3 = 7。
樣例2:在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接連購買股票,之后再將它們賣出。因為這樣屬于同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。
樣例3:在這種情況下, 不進行任何交易, 所以最大利潤為 0。
思路
貪心解法
- 因為我們有無限次的交易次數(shù),那么凡是存在data[i] > data[i-1]情形時,我們就可以獲得利潤。
- 利潤最大,就是得到所有可能的利潤。
C++ 代碼
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int p[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> p[i];
int res = 0;
for(int i = 0; i < n ; i ++)
{
res += max(0 , p[i+1] - p[i]);
}
cout << res <<endl;
return 0;
}