题目详情
题目分析:
- f[i][j]表示区间i~j最大能合出的数。
- 代码中len从小到大枚举区间长度,因为要从小区间转移到大区间。
- i是区间起点。
- j表示区间终点。
- f[1][n]未必是最后的答案,因为这个区间不一定能合并完全。ans在转移过程中取最大值。
- 当f[i][pos] != f[pos + 1][j]时,不能合并,因为这两个区间合并后的两个数不相等,根据题意,不相等的两个数不能合并。这是本题的关键。
#include <cstdio>
#include <algorithm>
using namespace std;
int n, f[333][333], ans;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &f[i][i]);
for (int len = 2; len <= n; len++)
for (int i = 1; i <= n - len + 1; i++){
int j = i + len - 1;
for (int pos = i; pos < j; pos++)
if (f[i][pos] == f[pos + 1][j] && f[i][pos] && f[pos + 1][j]){
f[i][j] = max(f[i][j], f[i][pos] + 1);
ans = max(ans, f[i][pos] + 1);
}
}
printf("%d\n", ans);
}