洛谷P3146 [USACO16OPEN]248 G 題解

description

在一個長度爲 nn 的序列中,每次可以合併相鄰兩個相等的數。問能合併出的最大數。

solution

涉及到了合併的問題,我們應當想到可以使用區間 dp。

那麼我們就設 f[l][r]f[l][r] 表示區間 [l,r][l,r] 裏的數經過合並可以得到的最大的一個數。

我們設想兩個區間能夠合併,就必須滿足兩個區間各自合併出的最大的數字相等,即 f[i][k]==f[k+1][r]f[i][k]==f[k+1][r],這裏 k,k+1k,k+1 爲兩個區間的分界點,那麼就可以合併。

合併之後就變成了整個大區間 f[l][r]f[l][r],我們只需要判斷是合併的價值更高還是原來大區間本身的價值更高就行了。

但是答案在輸出的時候要囊括所有的區間,因爲不一定合併到最大的區間的值最優。

時間複雜度:O(n3)O(n^3)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章