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 }
  • 相关阅读:
    妈妈之歌 The Mom Song 中文字幕
    40个实用的轻量级JavaScript库
    2009超强流行词汇
    60+CSS技巧教程资源大全
    关于zindex的那些事儿
    FF和IE之间7个JavaScript的差异
    IE6 不支持PNG问题
    邮件营销EDM模板制作规范
    css层的定位position、absolute、relative层叠加的五条叠加法则
    IE8的CSS hack
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5787086.html
Copyright © 2011-2022 走看看