Guest User

Untitled

a guest
Jun 22nd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. int dp[300][300];
  6. int w[300];
  7.  
  8. // 何個落とせるか
  9. int solve(int l, int r) {
  10. if (l >= r) return 0;
  11. // 基底(はじめ(1回目)に隣接している区間を落とす)
  12. if (l == r - 1) return abs(w[l] - w[r]) <= 1 ? 2 : 0;
  13. if (~dp[l][r]) return dp[l][r];
  14.  
  15. int ret = 0;
  16. // 1回目から順調に進んでいたら値を足していく
  17. int progress = solve(l + 1, r - 1);
  18. // 前までの進捗状況は r - l - 1 が理想
  19. if (abs(w[l] - w[r]) <= 1 && progress == r - l - 1) ret += 2 + progress;
  20.  
  21. for (int i = l; i < r; ++i) // i を中心として区間を分ける
  22. ret = max(ret, solve(l, i) + solve(i + 1, r));
  23. return dp[l][r] = ret;
  24. }
  25.  
  26. int main(int argc, char const *argv[]) {
  27. int n;
  28. while (cin >> n && n) {
  29. for (int i = 0; i < n; ++i) cin >> w[i];
  30. for (int i = 0; i < 300; ++i)
  31. for (int j = 0; j < 300; ++j)
  32. dp[i][j] = -1;
  33. int ret = solve(0, n-1);
  34. cout << ret << endl;
  35. }
  36. return 0;
Add Comment
Please, Sign In to add comment