codeforces1312E

題意:n(2e5)個數,相鄰兩個相同的a[i]可用一個數a[i]+1替換,最少能剩多少個數

區間DP..

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxN = 505;
int dp[maxN][maxN];
int what[maxN][maxN];
int n;
int a[maxN];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            if (i == j) {
                dp[i][j] = true;
                what[i][j] = a[i];
            }
            else {
                dp[i][j] = j - i + 1;
            }
        }
    }
    for (int len = 2; len <= n; len++) {
        for (int i = 1; i + len - 1 <= n; i++) {
            int j = i + len - 1;
            for (int k = i; k < j; k++) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
                if (dp[i][k] == 1 && dp[k + 1][j] == 1 && what[i][k] == what[k + 1][j]) {
                    dp[i][j] = 1;
                    what[i][j] = what[i][k] + 1;
                }
            }
        }
    }
    cout << dp[1][n];
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章