zoukankan      html  css  js  c++  java
  • LeetCode 638 Shopping Offers

    题目链接:

    LeetCode 638 Shopping Offers

    题解

    dynamic programing
    需要用到进制转换来表示状态,或者可以直接用一个vector来保存状态。

    代码

    1、未优化,超时代码:

    class Solution {
    public:
        int max(int x,int y){ return x>y?x:y; }
        int min(int x,int y){ return x>y?y:x; }
    
        int dfs(vector<int>& price,vector<vector<int> >& special, map<vector<int>,int>& dp,vector<int> cur){
            if(dp.count(cur)) return dp[cur];
            int &res=dp[cur]=INF;
    
            for(int i=0;i<special.size();i++){
                bool flag=true;
                vector<int> nex;
                for(int j=0;j<price.size();j++){
                    int tmp=cur[j]-special[i][j];
                    if(tmp<0){
                        flag=false; break;
                    }
                    nex.push_back(tmp);
                }
                if(flag){
                    res=min(res,dfs(price,special,dp,nex)+special[i][special[i].size()-1]);
                }
            }
    		
    		//这里可以优化,能优化的原因是因为转移顺序是可调整的
            for(int i=0;i<price.size();i++){
                vector<int> nex(cur);
                if(nex[i]>0){
                    nex[i]--;
                    res=min(res,dfs(price,special,dp,nex)+price[i]);
                }
            }
    
            return res;
        }
    
        int shoppingOffers(vector<int>& price, vector<vector<int> >& special, vector<int>& needs) {
            map<vector<int>,int> dp;
            vector<int> start;
            for(int i=0;i<price.size();i++){
                start.push_back(0);
            }
            dp[start]=0;
            vector<int> cur(needs);
            return dfs(price,special,dp,cur);
        }
    
    private:
        const static int INF=0x3f3f3f3f;
    
    };
    

    2、优化之后的代码

    class Solution {
    public:
        int max(int x,int y){ return x>y?x:y; }
        int min(int x,int y){ return x>y?y:x; }
    
        int dfs(vector<int>& price,vector<vector<int> >& special, map<vector<int>,int>& dp,vector<int> cur){
            if(dp.count(cur)) return dp[cur];
            int res=INF;
    
            for(int i=0;i<special.size();i++){
                bool flag=true;
                vector<int> nex;
                for(int j=0;j<price.size();j++){
                    int tmp=cur[j]-special[i][j];
                    if(tmp<0){
                        flag=false; break;
                    }
                    nex.push_back(tmp);
                }
                if(flag){
                    res=min(res,dfs(price,special,dp,nex)+special[i][special[i].size()-1]);
                }
            }
    		
    		//这里进行了优化
            int noSpecial=0;
            for(int i=0;i<cur.size();i++){
                noSpecial+=cur[i]*price[i];
            }
    
            res=min(res,noSpecial);
            return dp[cur]=res;
        }
    
        int shoppingOffers(vector<int>& price, vector<vector<int> >& special, vector<int>& needs) {
            map<vector<int>,int> dp;
            vector<int> start;
            for(int i=0;i<price.size();i++){
                start.push_back(0);
            }
            dp[start]=0;
            vector<int> cur(needs);
            return dfs(price,special,dp,cur);
        }
    
    private:
        const static int INF=0x3f3f3f3f;
    
    };
  • 相关阅读:
    POJ 3263 Tallest Cow(线段树)
    面试题54——表示数值的字符串
    ORA-01555错误总结(二)
    《AndroidStudio每日一贴》11. 重构之提炼为常量
    机器学习系统构建
    jsp不通过form和Ajax提交
    南邮算法分析与设计实验2 动态规划法
    cocos2d-x 3.2 之 2048 —— 第五篇
    Cocos2d-x学习资源集锦+有奖抽楼活动
    VMware虚拟机无法识别U盘解决方式
  • 原文地址:https://www.cnblogs.com/fenice/p/7209781.html
Copyright © 2011-2022 走看看