zoukankan      html  css  js  c++  java
  • LC 1687. Delivering Boxes from Storage to Ports (dp+slide window)

    link

    class Solution {
    public:
        int boxDelivering(vector<vector<int>>& boxes, int portsCount, int maxBoxes, int maxWeight) {
            int n=boxes.size();
            vector<int> dp(n);
            int left=0;
            int right=1;
            int diff=1;
            int curW=boxes[0][1];
            dp[0]=2;
            while(right<n){
                if(boxes[right][0]!=boxes[right-1][0]) diff++;
                curW+=boxes[right][1];
                while(left<right && (right-left+1>maxBoxes || curW>maxWeight || (left>0 && dp[left]==dp[left-1]))){
                    curW-=boxes[left][1];
                    if(boxes[left][0]!=boxes[left+1][0]) diff--;
                    left++;
                }
                dp[right]= left==0? diff+1 : dp[left-1]+diff+1;
                right++;
            }
            return dp[n-1];
        }
    };
    

    ref from zerotrac

    class Solution {
    public:
        int boxDelivering(vector<vector<int>>& boxes, int portsCount, int maxBoxes, int maxWeight) {
            int n=boxes.size();
            vector<int> diff(n);
            for(int i=1;i<n;i++){
                diff[i]=diff[i-1]+(boxes[i][0]!=boxes[i-1][0]);
            }
            vector<int> dp(n,INT_MAX);
            vector<int> f(n);
            deque<int> dq;
            vector<long long> wsum(n+1);
            for(int i=1;i<=n;i++) wsum[i]=wsum[i-1]+boxes[i-1][1];
            for(int i=0;i<n;i++){
                while(!dq.empty() && (i-dq.front()>maxBoxes || wsum[i+1]-wsum[dq.front()+1]>maxWeight)) dq.pop_front();
                if(i+1<=maxBoxes && wsum[i+1]<=maxWeight) dp[i]=diff[i]+2;
                
                if(!dq.empty()){
                    dp[i]=min(dp[i],f[dq.front()]+diff[i]+2);
                }
                f[i]=dp[i]- (i<n-1? diff[i+1]:0);
                
                while(!dq.empty() && f[dq.back()]>=f[i]){
                    dq.pop_back();
                }
                dq.push_back(i);
            }
            return dp[n-1];
        }
    };
    
  • 相关阅读:
    讲解SQL Server危险扩展存储删除和恢复
    新生活
    邮件发送作业调度 创建操作员
    Linux 定时任务 crontab
    短信猫二次开发接口函数及规范
    Linux修改用户shell
    Linux里$等记得转义
    网页标题前出现的图标
    Linux读书笔记
    DataStage通过分析日志获取Job插入目标表的记录数
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/14132029.html
Copyright © 2011-2022 走看看