#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[510] = {0};
int f[510][510] = {0};
int w[510][510] = {0};
int read()
{
int x = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') w = -1;
ch = getchar();
}
while(ch <= '9' && ch >= '0')
{
x = 10 * x + ch - '0';
ch = getchar();
}
return x * w;
}
int main()
{
int n = read();
memset(f, 50, sizeof(f));
for(int i = 1; i <= n; i++)
{
num[i] = read();
// if(num[i] == num[i - 1])
// {
// f[i - 1][i] = 1;
// w[i - 1][i] = num[i] + 1;
// }
f[i][i] = 1;
w[i][i] = num[i];
}
for(int i = n - 1; i >= 1; i--)
{
for(int j = i + 1; j <= n; j++)
{
for(int k = i; k < j; k++)
{
if(f[i][k] == 1 && f[k + 1][j] == 1)
{
if(w[i][k] == w[k + 1][j] && w[i][k] != 0)
{
f[i][j] = 1;
w[i][j] = w[i][k] + 1;
break;
}
}
f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
}
}
}
cout << f[1][n];
return 0;
}
简单的区间dp Div2 Mar/25/2020 E - Array Shrinking
最新推荐文章于 2022-10-20 17:36:42 发布