結果
| 問題 |
No.45 回転寿司
|
| ユーザー |
not_522
|
| 提出日時 | 2015-07-19 12:20:27 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,509 bytes |
| コンパイル時間 | 2,184 ms |
| コンパイル使用メモリ | 166,616 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-27 11:48:46 |
| 合計ジャッジ時間 | 2,462 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
template<typename... Args> class MemoizedRecursion {};
template<typename T> class MemoizedRecursion<T> {
protected:
vector<bool> use;
vector<T> mem;
bool used(int v) {
if (v >= (int)use.size()) {
use.resize(v + 1, false);
mem.resize(v + 1);
}
return use[v];
}
T memo(int v) {
return mem[v];
}
void push(T t, int v) {
use[v] = true;
mem[v] = t;
}
virtual T eval(int v) = 0;
public:
T solve(int v) {
if (used(v)) return memo(v);
T t = eval(v);
push(t, v);
return t;
}
};
template<typename T, typename... Args> class MemoizedRecursion<T, Args...> {
protected:
map<tuple<Args...>, T> mem;
bool used(Args... args) {
return mem.count(tie(args...));
}
T memo(Args... args) {
return mem[tie(args...)];
}
void push(T t, Args... args) {
mem[tie(args...)] = t;
}
virtual T eval(Args... args) = 0;
public:
T solve(Args... args) {
if (used(args...)) return memo(args...);
T t = eval(args...);
push(t, args...);
return t;
}
};
class Sushi : public MemoizedRecursion<int> {
private:
vector<int> v;
int eval(int i) {
if (i == 0) return v[0];
if (i == 1) return max(v[0], v[1]);
return max(solve(i - 1), solve(i - 2) + v[i]);
}
public:
Sushi(const vector<int>& v) : v(v) {}
};
int main() {
int n;
cin >> n;
vector<int> v(n);
for (int& i : v) cin >> i;
Sushi sushi(v);
cout << sushi.solve(n - 1) << endl;
}
not_522