题目链接
题意:相同的两个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]);
}