//本题用动态规划求解
/dp[n][2] 中两列0,1分别表示持有股票和未持有股票 n代表当天最大收益 初始值dp[0][0] = 0;
//dp状态转移方程为 dp[n][0] = max(dp[n-1][0],dp[n-1][1]+prices[n]) 当天最大收益由两种情况递推而来
//1.前面的日子仍未购买 2.之前购买,现在卖出
//dp[n][1] = max(dp[n-1][1],-prices[n])
//1.之前买了,现在也不卖 2.之前没买 现在买了
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int length = 0;
cin>>length;
int inits[length];
int temp = 0;
for (int i = 0; i < length; ++i) {
cin>>temp;
inits[i] = temp;
}
int dp[length][2];
dp[0][0] = 0;
dp[0][1] = -inits[0];
for (int i = 1; i < length; ++i) {
dp[i][0] = max(dp[i-1][0],dp[i-1][1] + inits[i]);
dp[i][1] = max(dp[i-1][1],-inits[i]);
}
cout<<dp[length-1][0];
}
// 64 位输出请用 printf("%lld")
import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) throws Exception {
StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(System.out));
int length = 0;
streamTokenizer.nextToken();
length = (int) streamTokenizer.nval;i
nt[] ints = new int[length];
for (int i = 0; i < length; i++) {
streamTokenizer.nextToken();
ints[i] = (int) streamTokenizer.nval;
}
int[][] dp = new int[length][2];
dp[0][0] = 0;
dp[0][1] = -ints[0];
for (int i = 1; i < length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + ints[i]);
dp[i][1] = Math.max(dp[i - 1][1], - ints[i]);
}
printWriter.println(dp[length - 1][0]);
printWriter.flush();
}
}

京公网安备 11010502036488号