結果
| 問題 | 
                            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