題目鏈接
題意:相同的兩個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]);
}