题目:
分析:还是太菜,想不出来!
还是在想左右两部分在合并时的问题。
题解中引入了完全合并,即区间内必须是能合并到最后是一个数。
值得深入的想想。
代码:竟然T了:
#include<bits/stdc++.h>
using namespace std
;
int m
;
int A
[250];
int D
[250][250];
int maxx
=-1;
int f(int x
,int y
)
{
if(D
[x
][y
]!=-1) return D
[x
][y
];
if(x
==y
) return A
[x
];
if(x
+1==y
)
{
if(A
[x
]==A
[y
]) return A
[x
]+1;
return 0;
}
for(int i
=x
;i
<y
;i
++)
{
int c1
=f(x
,i
);
int c2
=f(i
+1,y
);
if(c1
==0||c2
==0) continue;
if(c1
==c2
)
{
D
[x
][y
]=max(D
[x
][y
],c1
+1);
}
}
return D
[x
][y
];
}
int main()
{
cin
>>m
;
for(int i
=0;i
<m
;i
++)
{
cin
>>A
[i
]; maxx
=max(maxx
,A
[i
]);
}
memset(D
,-1,sizeof(D
));
for(int i
=0;i
<m
-1;i
++)
for(int j
=i
+1;j
<m
;j
++)
{
maxx
=max(maxx
,f(i
,j
));
}
cout
<<maxx
;
}
题解:大概看了一下,确实可以吧!但感觉我写的递归也没到超时的地步,毕竟记忆化了。
转载请注明原文地址:https://blackberry.8miu.com/read-2685.html