一、题目
二、解法
如果一个区间能化成一个数,那么这个数是固定的,我们可以用区间 的方式 地把它算出来。
然后问题就变成了前 个数化成最少的段,使每个段都能化成一个数,暴力 是 的。
#include <cstdio>
#include <iostream>
using namespace std;
const int M = 505;
int read()
{
int x=0,flag=1;char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int n,a[M],dp[M][M],f[M];
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
dp[i][i]=a[i];
}
for(int i=n;i>=1;i--)
for(int j=i;j<=n;j++)
for(int k=i;k<j;k++)
if(dp[i][k]==dp[k+1][j] && dp[i][k])
dp[i][j]=dp[i][k]+1;
for(int i=1;i<=n;i++)
{
f[i]=1e9;
for(int j=0;j<i;j++)
if(dp[j+1][i])
f[i]=min(f[i],f[j]+1);
}
printf("%d\n",f[n]);
}