zoukankan      html  css  js  c++  java
  • 九度oj 题目1537:买卖股票

    题目描述:

    给定一个大小为n的数组,数组的元素a[i]代表第i天的股票价格。
    设计一个算法,计算在最多允许买卖k次(一买一卖记为一次)的条件下的最大收益。
    需要注意的是,你不能同时拥有两份股票。也就是说在下次买入前,你必须把手头上原有的股票先卖掉。

    输入:

    输入可能包含多个测试案例。
    对于每个测试案例,输入的第一行为两个整数n和k(1<=n,k<=1000)。
    输入的第二行包括n个整数,范围在[0,10000),代表数组中的元素。

    输出:

    对应每个测试案例,输出最大获益。

    样例输入:
    5 1
    3 4 5 1 4
    7 2
    1 2 3 5 6 1 7
    
    样例输出:
    3
    11
    这题好难
    代码如下
     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 int n, k;
     8 int toDo[1002];
     9 int dp[1002][1002];
    10 //前i天交易j次的最大收益
    11 //dp[i][j] = max(dp[i-1][j], dp[t-1][j-1] + toDo[i] - toDo[t]);(0 <= t <= i-1, t天买入, 在i天卖出)
    12 //
    13 int main(int argc, char const *argv[])
    14 {
    15     while(scanf("%d %d",&n, &k) != EOF ) {
    16         for(int i = 0; i < n; i++) {
    17             scanf("%d",&toDo[i]);
    18         }
    19 
    20         memset(dp, 0, sizeof(dp));
    21 
    22         for(int j = 1; j <= k; j++) {
    23             int maxt = -toDo[0];     
    24             for(int i = 0; i <= n; i++) {
    25                 if(i != 0) {
    26                     dp[i][j] = max(dp[i-1][j], maxt+toDo[i]);
    27                 }
    28                 else {
    29                     dp[i][j] = maxt+toDo[i];
    30                 }    
    31                 maxt = max(maxt, dp[i][j-1] - toDo[i+1]);//
    32             }
    33         }
    34         
    35         printf("%d
    ", dp[n-1][k]);
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    2020牛客暑期多校训练营(第二场)G-Greater and Greater bitset
    2020牛客暑期多校训练营(第二场)H Happy Triangle 线段树
    平衡树——splay
    动态规划之状态压缩
    动态规划入门理解
    快速幂入门
    最小生成树初步
    线性筛素数
    最短路径—迪杰斯特拉算法入门
    并查集初步
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5787086.html
Copyright © 2011-2022 走看看