zoukankan      html  css  js  c++  java
  • 1043. 分隔数组以得到最大和

    O(nk)的dp就能解决

    dp[n][j] 表示当最后一个数以第j种方式取时的最大值,其中j <= k

    推广到每个i即可,

    用pre[i]存储第i个数不同取法中的最大值

    class Solution {
    public:
    
        int dp[550][550];
        int pre[550];
        int maxSumAfterPartitioning(vector<int>& arr, int k) {
            int n = arr.size();
            memset(dp, 0, sizeof(dp));
            memset(pre, 0, sizeof(pre));
            dp[1][1] = arr[0];
            pre[1] = dp[1][1];
            for(int i = 2; i <= n; i++)
            {
                int tmp = -1;
                int max_v = -1;
                for(int j = 0; j < k; j++)
                {
                    
                    if(i >= j + 1)
                    {
                        max_v = max(max_v, arr[i - j - 1]);
                        dp[i][j + 1] = pre[i - j - 1] + max_v * (j + 1);
                        pre[i] = max(pre[i], dp[i][j + 1]);
                    }
                    else
                        break;
                }
            }
            int max_ret = -1;
            for(int i = 1; i <= k; i++)
                max_ret = max(max_ret, dp[n][i]);
            return max_ret;
    
        }
    };
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    memcached 高级机制(一)
    memcached 简介
    Hibernate
    Linux中的搜索命令
    Linux的常用命令
    Git清除用户名和密码
    关于Git的简单使用
    文件的上传与下载(2)
    关于文件的上传和后台接收
    验证码的制作
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/15521530.html
Copyright © 2011-2022 走看看