rt.
个人认为算法没问题。
find_代表对于某种状态可能的代表的数。
#include<bits/stdc++.h>
#define max_size 305
using namespace std;
int ans[max_size][max_size];
int find_[max_size][max_size][max_size];
int f[max_size][max_size];
int arr[max_size];
int n,tot;
/*
cout<<i<<" "<<k<<" "<<j<<endl;
if (f[i][k]==f[k][j]) {
f[i][j]=max(f[i][j],f[i][k]+1);
}
*/
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
for(int i=1;i<=n;i++) ans[i][i]=arr[i];
for(int i=1;i<=n;i++) {
for(int j=i+1;j<=n;j++) {
if (ans[i][j-1]==arr[j])
ans[i][j]=max(ans[i][j],ans[i][j-1]+1);
else
ans[i][j]=arr[i];
tot=max(ans[i][j],tot);
}
}
for(int i=1;i<=n;i++) {
for(int j=i+1;j<=n;j++) {
find_[i][j][ans[i][j]]=1;
f[i][j]=ans[i][j];
}
}
for(int len=2;len<n;len++) {
for(int i=1;i<len;i++) {
for(int j=0;j<=n-len;j++) {
if (find_[j+i][len][f[j][j+i]] || find_[j][j+i][f[j+i][len]]) {
f[j][j+len]=max(f[j][j+len],f[j][j+i]+1);
find_[j][j+len][f[j][j+len]]=1;
}
}
}
}
cout<<f[1][n];
}