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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章