<問題>
①モンスターの集合が与えられ、各モンスターは怖さの値とコインの値を持つ。
②プレイヤーは最初から順番にモンスターに遭遇する。
③このとき、プレイヤーはモンスターにそのコインの値を支払って仲間にすることができる。
④もしくは、仲間にしたモンスターの怖さの和がそのモンスターの怖さの値以上であれば、何もせずに通り過ぎることができる。それ未満であれば、仲間にしないといけない。
⑤このとき、すべてのモンスターに遭遇した後に最小のコイン消費枚数を返す。
<解き方>
まさに動的計画法。
参照用のvectorをグローバルで宣言してpush_backでコピーしようとしたんですが、
エラーが出たので引数で渡すことに。
suztomoさんのページを拝見させていただいたのですが、
10^7以上のループに加え、あまり大きな数を扱ってもダメなのかもしれないです。
http://topcoder.g.hatena.ne.jp/suztomo/20081208/1228768981
<コード>
class MonstersValley2 {
public:
int f(int cur, double cdread, vector<int> d, vector<int> p){
int coin=0;
if(cur==n)return 0;
if(cdread<d[cur])coin=p[cur]+f(cur+1,cdread+d[cur],d,p);
else coin=min(f(cur+1,cdread,d,p),f(cur+1,cdread+d[cur],d,p)+p[cur]);
return coin;
}
int minimumPrice(vector<int> dread, vector<int> price) {
n=dread.size();
return f(1,dread[0],dread,price)+price[0];
}
};
①モンスターの集合が与えられ、各モンスターは怖さの値とコインの値を持つ。
②プレイヤーは最初から順番にモンスターに遭遇する。
③このとき、プレイヤーはモンスターにそのコインの値を支払って仲間にすることができる。
④もしくは、仲間にしたモンスターの怖さの和がそのモンスターの怖さの値以上であれば、何もせずに通り過ぎることができる。それ未満であれば、仲間にしないといけない。
⑤このとき、すべてのモンスターに遭遇した後に最小のコイン消費枚数を返す。
<解き方>
まさに動的計画法。
参照用のvectorをグローバルで宣言してpush_backでコピーしようとしたんですが、
エラーが出たので引数で渡すことに。
suztomoさんのページを拝見させていただいたのですが、
10^7以上のループに加え、あまり大きな数を扱ってもダメなのかもしれないです。
http://topcoder.g.hatena.ne.jp/suztomo/20081208/1228768981
<コード>
class MonstersValley2 {
public:
int f(int cur, double cdread, vector<int> d, vector<int> p){
int coin=0;
if(cur==n)return 0;
if(cdread<d[cur])coin=p[cur]+f(cur+1,cdread+d[cur],d,p);
else coin=min(f(cur+1,cdread,d,p),f(cur+1,cdread+d[cur],d,p)+p[cur]);
return coin;
}
int minimumPrice(vector<int> dread, vector<int> price) {
n=dread.size();
return f(1,dread[0],dread,price)+price[0];
}
};