Array Shrinking

E - Array Shrinking

dp[i][j].fi表示连通块的大小,用dp[i][j].se表示连通块表示的数。

然后再进行动态规划,a[i]表示从1~i可以得到的最短长度。

// Created by CAD on 2020/3/9.
#include <bits/stdc++.h>

#define fi first
#define se second
#define pii pair<int,int>
using namespace std;

pii dp[505][505];
int a[505];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for(int i=1;i<=n;++i)
        cin>>dp[i][i].se,dp[i][i].fi=1;
    for(int i=1;i<=n;++i)
        for(int j=i;j>=1;--j){
            for(int k=i-1;k>=j;--k){
                if(dp[k+1][i].se&&dp[j][k].se&&dp[k+1][i].se==dp[j][k].se)
                    dp[j][i].se=dp[k+1][i].se+1,dp[j][i].fi=dp[k+1][i].fi+dp[j][k].fi;
            }
        }
    for(int i=1;i<=n;++i){
        a[i]=a[i-1]+1;
        for(int j=i-1;j>=1;--j){
            if(dp[j][i].fi) a[i]=min(a[i-dp[j][i].fi]+1,a[i]);
        }
    }
    cout<<a[n]<<"\n";
    return 0;
}
posted @ 2020-03-10 09:05  caoanda  阅读(186)  评论(0编辑  收藏  举报