description
在一個長度爲 的序列中,每次可以合併相鄰兩個相等的數。問能合併出的最大數。
solution
涉及到了合併的問題,我們應當想到可以使用區間 dp。
那麼我們就設 表示區間 裏的數經過合並可以得到的最大的一個數。
我們設想兩個區間能夠合併,就必須滿足兩個區間各自合併出的最大的數字相等,即 ,這裏 爲兩個區間的分界點,那麼就可以合併。
合併之後就變成了整個大區間 ,我們只需要判斷是合併的價值更高還是原來大區間本身的價值更高就行了。
但是答案在輸出的時候要囊括所有的區間,因爲不一定合併到最大的區間的值最優。
時間複雜度:。
code
#include<cstdio>
#include<algorithm>
using namespace std;
int f[300][300];
int main()
{
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i][i]);
ans=max(ans,f[i][i]);
}
for(int dis=2;dis<=n;dis++)
{
for(int l=1;l+dis-1<=n;l++)
{
int r=l+dis-1;
for(int k=l;k<r;k++)
{
if(f[l][k]==f[k+1][r]&&f[l][k])
{
f[l][r]=max(f[l][k]+1,f[l][r]);
}
}
ans=max(ans,f[l][r]);
}
}
printf("%d\n",ans);
return 0;
}