Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstring>
- #include <iostream>
- #include <set>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- int a[500];
- int dp2[500][501];
- int solve(int i, int j) {
- if (i+1 == j) return 0;
- if (dp2[i][j] != -1) return dp2[i][j];
- int &res = dp2[i][j] = INF;
- for (int k=i+1; k < j; k++) {
- set<int> s1(a+i, a+k), s2(a+k, a+j);
- int steps = 0;
- set<int>::iterator it1=s1.begin(), it2=s2.begin();
- if (*it2 < *it1) {
- steps++;
- while(it2 != s2.end() && *it2 < *it1) it2++;
- }
- while(it1 != s1.end()) {
- steps++;
- while(it1 != s1.end() && it2 != s2.end() && *it1 < *it2) it1++;
- if (it2 == s2.end()) break;
- steps++;
- while(it1 != s1.end() && it2 != s2.end() && *it2 < *it1) it2++;
- }
- res = min(res, solve(i, k) + solve(k, j) + 2*steps-3);
- }
- return res;
- }
- int main() {
- int n; cin >> n;
- for (int i=0; i < n; i++) cin >> a[i];
- int dp[n+1]; dp[0] = 0; memset(dp2, -1, sizeof dp2);
- for (int i=1; i <= n; i++) {
- dp[i] = INF;
- for (int j=0; j < i; j++) {
- set<int> s(a+j, a+i);
- if (s.size() == i-j && *(--s.end()) == i-j)
- dp[i] = min(dp[i], dp[j] + solve(j, i));
- }
- }
- if (dp[n] == INF) cout << "impossible" << endl;
- else cout << dp[n] << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement