公司网站制作,wordpress 文章标题移动,wordpress安装环境,中国交通建设集团官网题目 1302#xff1a;股票买卖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:8660 通过数: 4290 【题目描述】 最近越来越多的人都投身股市#xff0c;阿福也有点心动了。谨记着“股市有风险#xff0c;入市需谨慎”#xff0c;阿福决定先来研究一下简化版的股… 题目 1302股票买卖 时间限制: 1000 ms 内存限制: 65536 KB 提交数:8660 通过数: 4290 【题目描述】 最近越来越多的人都投身股市阿福也有点心动了。谨记着“股市有风险入市需谨慎”阿福决定先来研究一下简化版的股票买卖问题。 假设阿福已经准确预测出了某只股票在未来N天的价格他希望买卖两次使得获得的利润最高。为了计算简单起见利润的计算方式为卖出的价格减去买入的价格。 同一天可以进行多次买卖。但是在第一次买入之后必须要先卖出然后才可以第二次买入。 现在阿福想知道他最多可以获得多少利润。 【输入】 输入的第一行是一个整数T(T≤50)表示一共有T组数据。 接下来的每组数据第一行是一个整数N(1≤N≤100,000)表示一共有N天。第二行是 N 个被空格分开的整数表示每天该股票的价格。该股票每天的价格的绝对值均不会超过1,000,000。 【输出】 对于每组数据输出一行。该行包含一个整数表示阿福能够获得的最大的利润。 【输入样例】 3
7
5 14 -2 4 9 3 17
6
6 8 7 4 1 -2
4
18 9 5 2 【输出样例】 28
2
0分析 题目说阿福一共只做两次买卖而且必须第一次做完买卖才能开始第二次买卖。所以我们不难发现本题简化成把一段线段从一个点开始分为两段。 也就是这样最后把上下两行加起来后每一列的最大值就是答案。 代码 #include bits/stdc.h
using namespace std;const int MAXSIZE 100005;
int dp[MAXSIZE][2], a[MAXSIZE];int main() {int T;cin T;while (T--) {memset(dp, 0, sizeof (dp));int n;cin n;for (int i 1; i n; i)cin a[i];int mn a[1], mx a[n];for (int i 2; i n; i) { // 第一行mn min(mn, a[i]);dp[i][0] max(dp[i - 1][0], a[i] - mn);}for (int i n - 1; i 1; i--) { // 第二行mx max(mx, a[i]);dp[i][1] max(dp[i 1][1], mx - a[i]);}mx 0x80000000;for (int i 1; i n; i)mx max(mx, dp[i][0] dp[i][1]);cout mx endl;}return 0;
}