Advertisement
jonathanasdf

Untitled

Jul 5th, 2013
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <cstring>
  2. #include <iostream>
  3. #include <set>
  4. using namespace std;
  5. const int INF = 0x3f3f3f3f;
  6. int a[500];
  7. int dp2[500][501];
  8. int solve(int i, int j) {
  9.     if (i+1 == j) return 0;
  10.     if (dp2[i][j] != -1) return dp2[i][j];
  11.     int &res = dp2[i][j] = INF;
  12.     for (int k=i+1; k < j; k++) {
  13.         set<int> s1(a+i, a+k), s2(a+k, a+j);
  14.         int steps = 0;
  15.         set<int>::iterator it1=s1.begin(), it2=s2.begin();
  16.         if (*it2 < *it1) {
  17.             steps++;
  18.             while(it2 != s2.end() && *it2 < *it1) it2++;
  19.         }
  20.         while(it1 != s1.end()) {
  21.             steps++;
  22.             while(it1 != s1.end() && it2 != s2.end() && *it1 < *it2) it1++;
  23.             if (it2 == s2.end()) break;
  24.             steps++;
  25.             while(it1 != s1.end() && it2 != s2.end() && *it2 < *it1) it2++;
  26.         }
  27.         res = min(res, solve(i, k) + solve(k, j) + 2*steps-3);
  28.     }
  29.     return res;
  30. }
  31. int main() {
  32.     int n; cin >> n;
  33.     for (int i=0; i < n; i++) cin >> a[i];
  34.     int dp[n+1]; dp[0] = 0; memset(dp2, -1, sizeof dp2);
  35.     for (int i=1; i <= n; i++) {
  36.         dp[i] = INF;
  37.         for (int j=0; j < i; j++) {
  38.             set<int> s(a+j, a+i);
  39.             if (s.size() == i-j && *(--s.end()) == i-j)
  40.                 dp[i] = min(dp[i], dp[j] + solve(j, i));
  41.         }
  42.     }
  43.     if (dp[n] == INF) cout << "impossible" << endl;
  44.     else cout << dp[n] << endl;
  45.     return 0;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement