CasketOfStarEasy

問題

  • CasketOfStarEasy
  • 長さ n の数列x[i]が与えられる(インデックスは0, ..., n-1とする)。
  • 以下の手順を数列の長さが2になるまで繰り返す。
    • 0 < i < n-1 なる i を選ぶ
    • x[i]は消える
    • この時、x[i-1] * x[i+1]が得点として加算される
  • 最終的な得点が最大になる手順を探せ

方針

再帰で全探索。

コード

#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iterator>


using namespace std;


class CasketOfStarEasy{
public:
  int maxEnergy(vector <int> weight){
    return doit(weight);
  }
  int doit(vector<int> w){
    //copy(w.begin(), w.end(), ostream_iterator<int>(cout, ",")); cout << endl;
    if(w.size() == 2) return 0;
    int ret = 0;
    for(int i = 1; i < w.size()-1; i++){
      vector<int> x;
      for(int j = 0; j < w.size(); j++){
	if(j != i){
	  x.push_back(w[j]);
	}
      }
      ret = max(ret, w[i-1] * w[i+1] + doit(x));
    }
    return ret;
  }
};