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& price,vector<vector >& special, map<vector,int>& dp,vector 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 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 nex(cur);
if(nex[i]>0){
nex[i]--;
res=min(res,dfs(price,special,dp,nex)+price[i]);
}
}

return res;
}

int shoppingOffers(vector& price, vector<vector >& special, vector& needs) {
map<vector,int> dp;
vector start;
for(int i=0;i<price.size();i++){
start.push_back(0);
}
dp[start]=0;
vector 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& price,vector<vector >& special, map<vector,int>& dp,vector cur){
if(dp.count(cur)) return dp[cur];
int res=INF;

for(int i=0;i<special.size();i++){
bool flag=true;
vector 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& price, vector<vector >& special, vector& needs) {
map<vector,int> dp;
vector start;
for(int i=0;i<price.size();i++){
start.push_back(0);
}
dp[start]=0;
vector cur(needs);
return dfs(price,special,dp,cur);
}

private:
const static int INF=0x3f3f3f3f;

};

posted @ 2017-07-20 10:26  fenicnn  阅读(511)  评论(0)    收藏  举报