E. Array Shrinking.Educational Codeforces Round 83 (Rated for Div. 2)

教育场的一道区间dp题;

题目让在相邻两项如果相等则可以合并且++的条件下求最短的区间长度。

可以枚举区间长度,然后再在每个长度下遍历数组。

而对于每一个区间,其最终值等于其子区间值的和。那么就需要遍历每个长度时遍历其子区间。

如果遇到某两个子区间之间经过一系列操作后长度都为1且相等,则可以将他们合并。

上代码

#include<bits/stdc++.h>
using namespace std;
long long a[505][505];
long long dp[505][505];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            dp[i][j]=j-i+1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        cin>>a[i][i];
    }
    for(int i=len;i<=n;i++)
    {
        for(int j=1;j<=n-len+1;j++)
        {
            int r=j+len-1;
            for(int k=j;k<r;k++)
            {
                dp[j][r]=min(dp[j][r],dp[j][k]+dp[k+1][r]);
                if(dp[j][k]==1&&dp[k+1][r]==1&&a[j][k]==a[k+1][r])
                {
                    a[j][r]=a[j][k]+1;
                    dp[j][r]=1;
                }
            }
        }
    }
    cout<<dp[1][n]<<endl;
    
    
}
rush!
原文地址:https://www.cnblogs.com/LH2000/p/12462812.html