Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // clang-format off
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <stack>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <set>
- #include <deque>
- #include <queue>
- #include <map>
- #include <bitset>
- #include <random>
- #include <list>
- #include <unordered_map>
- #include <unordered_set>
- #include <cassert>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef string str;
- //typedef __int128 ultraint;
- #define sqrt sqrtl
- #define F first
- #define S second
- #define endl '\n'
- #define all(vc666) vc666.begin(), vc666.end()
- #define allr(vc666) vc666.rbegin(), vc666.rend()
- //#define int long long
- #define degug(x) cerr (#x) << " " << (x) << endl;
- const ll INF = (ll)2e18 + 7;
- const ll inf = 1e9 + 7;
- const ll ONE = 1;
- const ll MOD = 1e8;
- ld EPS = 1e-12;
- ld PI = 3.1415926535897932384;
- mt19937_64 gen(3);
- const ll max_sz = 405;
- int dp[max_sz][max_sz];
- bitset <max_sz> zxc[max_sz][max_sz];
- void solve() {
- int n, M, i, j, l, r, m, sup, len;
- cin >> n >> M;
- for (i = 0; i < max_sz; i++) {
- for (j = 0; j < max_sz; j++) {
- dp[i][j] = inf;
- }
- }
- vector <int> a(n), cnt(M + 1);
- for (i = 0; i < n; i++) {
- cin >> a[i];
- }
- for (i = 0; i < n; i++) {
- dp[i][i] = 0;
- zxc[i][i][a[i]] = true;
- }
- for (len = 2; len <= n; len++) {
- for (l = 0; l <= n - len; l++) {
- r = l + len - 1;
- cnt.assign(M + 1, 0);
- for (i = l; i <= r; i++) {
- cnt[a[i]]++;
- }
- for (m = l; m < r; m++) {
- if (cnt[a[m]] > 1 && zxc[l][m][a[m]] && zxc[m + 1][r][a[m]]) {
- if (dp[l][r] > dp[l][m] + dp[m + 1][r]) {
- dp[l][r] = dp[l][m] + dp[m + 1][r];
- zxc[l][r] = (zxc[l][m] & zxc[m + 1][r]);
- }
- else if (dp[l][r] == dp[l][m] + dp[m + 1][r]) {
- zxc[l][r] |= (zxc[l][m] & zxc[m + 1][r]);
- }
- }
- else {
- if (dp[l][r] > dp[l][m] + dp[m + 1][r] + 1) {
- dp[l][r] = dp[l][m] + dp[m + 1][r] + 1;
- zxc[l][r] = (zxc[l][m] | zxc[m + 1][r]);
- }
- else if (dp[l][r] == dp[l][m] + dp[m + 1][r] + 1) {
- zxc[l][r] |= (zxc[l][m] | zxc[m + 1][r]);
- }
- }
- cnt[a[m]]--;
- }
- }
- }
- cout << dp[0][n - 1] << endl;
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- //freopen("ladder.in", "r", stdin);
- //freopen("ladder.out", "w", stdout);
- ios_base::sync_with_stdio(0);
- cin.tie(NULL);
- cout.tie(NULL);
- int t = 1;
- //cin >> t;
- while (t--) solve();
- }
- //Deisgned by skimono
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement