• 638. Shopping Offers


    Problem refer: https://leetcode.com/problems/shopping-offers/description/

    Official solution refer: https://leetcode.com/problems/shopping-offers/solution/

    // My solution:
    // A good dp problem.
    // The solution has refered to
    the official solution
    // because I didn't figure out that
    how to store the state
    // for dynamic plannning until told
    to use std::map. // Some optimizations added by myself: // There is no point in using using special offers in needs, // so we only care about the unused offers and ignore the ones that be applyed before // when do the memory search(dynamic planning). class Solution { public: // These two varibles will nerver gonna to be changed, so move its out of the function. vector<int> g_price; vector<vector<int>> g_special; // Store the state of the dynamic plannning. std::map<vector<int>, int> g_ans; std::map<vector<int>, int>::iterator it_g_ans; // The function to do memory search with every state of needs. // The special id is used to pruning. int shop_calc(vector<int> needs, int special_id) { // If the state was already get, return the result directly. it_g_ans = g_ans.find(needs); if (it_g_ans != g_ans.end()) return it_g_ans -> second; // For every new state, just calc the normal price as the initial value. // PS.I also used memory search there at the beginning which leaded to the time limit exceeded. // It really don't need to plannning because the special offers are the variables. int ans = 0; for (int i=0; i<g_price.size(); i++) { if (needs[i] <= 0) continue; ans += needs[i] * g_price[i]; } // To do the memory search with every possible special offers. // The offers which be processed before are no need to join the next search. for (int i=special_id; i<g_special.size();i++) { bool cansp = true; vector<int> next = needs; for (int j=0; j<g_price.size(); j++) { next [j] -= g_special[i][j]; if (next[j] < 0) { cansp = false; break; } } // To figure out the optimized answer for this state. if (cansp) { ans = min(ans, shop_calc(next, i) + g_special[i][g_price.size()]); } } g_ans[needs] = ans; return ans; } int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) { g_price = price; g_special = special; return shop_calc(needs, 0); } };
  • 相关阅读:
    bzoj4950
    P1377发奖金
    环信SDK与Apple Watch的结合(1)
    环信SDK与Apple Watch的结合(2)
    【Objective-C】0-第一个OC的类
    【Objective-C】4-空指针和野指针
    【Objective-C】3 -self关键字
    【Objective-C】2.自定义构造方法和description方法
    Swift函数|闭包
    Swift枚举|结构体|类|属性|方法|下标脚本|继承
  • 原文地址:https://www.cnblogs.com/kkrisen/p/7884290.html
Copyright © 2020-2023  润新知