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

题目链接
在这里插入图片描述在这里插入图片描述
题意:相同的两个x可以合并成x+1,给一个序列,问最后最少能剩下多少个元素。
思路:标准的区间DP,dp【i】【j】代表区间【i,j】内的合并后的最少元素个数。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
typedef long long ll;
int n,a[maxn][maxn],dp[maxn][maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	for(int j=i+1;j<=n;++j)
	dp[i][j]=j-i+1;
	for(int i=1;i<=n;++i) scanf("%d",&a[i][i]),dp[i][i]=1;
	for(int len=2;len<=n;++len)
	{
		for(int l=1;l+len-1<=n;++l)
		{
			int r=l+len-1;
			for(int k=l;k<r;++k)
			{
				dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
				if(dp[l][k]==1&&dp[k+1][r]==1&&a[l][k]==a[k+1][r])
				dp[l][r]=1,a[l][r]=a[l][k]+1;
			}
		}
	}
	printf("%d\n",dp[1][n]);
}
发布了391 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105397555