[USACO16OPEN]248 G

原题链接

题解

一道区间dp裸题,跟模板题石子合并差不多,但是这里是在玩2048,所以要一样才能合并,而且记录的是出现过的最大值,所以答案不一定是 \(f[1][n]\),因为可能出现无法合并的情况。
转移方程:

\[f[i][j]=max(f[i][j],f[k+1][j]+1)(i \le k < j) \]

Code:

#include<bits/stdc++.h>
using namespace std;
void read(int &x)
{
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
	x=r*w;
}
const int N=260;
int a[N],f[N][N],s[N];
int main()
{
	int n,ans=0;
	read(n);
	for(int i=1;i<=n;i++)
		read(f[i][i]),ans=max(ans,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 k=i;k<j;k++)
		if(f[i][k]==f[k+1][j])
			f[i][j]=max(f[i][j],f[k+1][j]+1),ans=max(ans,f[i][j]);
	}
	cout<<ans;
	return 0;
}
posted @ 2022-07-06 11:31  Epoch_L  阅读(12)  评论(0编辑  收藏  举报