• 动态规划——Best Time to Buy and Sell Stock IV


    这是这个系列题目的第四个,题目大意和之前的差不多,但是这次提供最多k次的操作,操作还是不能同时操作即必须结束前一个操作才能进行后一个操作。
    状态比较好理解,就是题目要求的缩小版,dp[k][i]表示进行到第i天时最多k次操作能得到的最大利益,但是要注意最后一次操作不一定时第i天完成的。
    状态转移方程:dp[k][i] = max(dp[k][i-1],dp[k-1][j]+prices[i]-prices[j]) (0<=j<=i)
    比如现在正在考虑dp[k][i],选择有两种,一是第i天不操作,二是在第k-1次第j天后进行第k次操作。这个题的状态转移方程相对来说还是比较容易理解的。
    当然如果给的操作数比总天数的一半还要多的话,相邻两天一次交易即可,当然要保证后一天的价格比前一天的价格要高。这种情况就不用再动态的递推了,直接累加即可。
     1 class Solution{
     2     public static int maxProfit(int k,int[] prices) {
     3         int nlen = prices.length;
     4         if(nlen<=1)return 0;
     5         else if(k>nlen/2) {
     6             int res = 0;
     7             for(int i = 1;i<nlen;i++)
     8                 if(prices[i]>prices[i-1])res+=(prices[i]-prices[i-1]);
     9             return res;
    10         }else {
    11             int temp = 0;
    12             int[][]dp = new int[k+1][nlen];
    13             Arrays.fill(dp[0],0);
    14             for(int i = 0;i<=k;i++)
    15                 dp[i][0] = 0;
    16             for(int kt = 1;kt<=k;kt++) {
    17                 for(int i = 1;i<nlen;i++) {
    18                     temp = 0;
    19                     for(int j = 0;j<=i;j++)
    20                         temp = temp>(dp[kt-1][j]+prices[i]-prices[j])?temp:(dp[kt-1][j]+prices[i]-prices[j]);
    21                     dp[kt][i] = dp[kt][i-1]>temp?dp[kt][i-1]:temp;
    22                 }
    23             }
    24             return dp[k][nlen-1];
    25         }
    26     }
    27 }

    不过在最后说一句,由于我编写的代码使用了三层for循环,时间复杂度为O(n^3),在LeetCode上仅仅击败了不到9%的人,额,又是一个比较惨淡的数据了。。。。

  • 相关阅读:
    特性和属性
    装箱和拆箱的问题(NET1.1+)
    poj 1013 Counterfeit Dollar(模拟)
    poj 3686 The Windy's( KM算法 )
    二分匹配(匈牙利算法)
    poj 3273 Monthly Expense(二分)
    poj 2115 C Looooops(扩展欧几里德)
    poj 2400 Supervisor, Supervisee
    poj 2195 Going Home (KM算法)
    poj 2513 Colored Sticks(trie树 + 并查集 + 欧拉图)
  • 原文地址:https://www.cnblogs.com/messi2017/p/9903335.html
Copyright © 2020-2023  润新知