2024牛客暑期多校训练营2 - I. Red Playing Cards

思路与官方题解一样,不过我采用了递归的写法,这样就可以避免排序等操作。

另外还要注意递归的时候不能让多个不同的递归函数同时修改一个数组,否则这个数组同时被多个函数使用,会很混乱。我这里把它开成了二维来避免这个问题。

代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=3005;
int n,a[N<<1],L[N],R[N];
long long f[N],g[N][N<<1];

long long DFS(int x)
{
	if(f[x]) return f[x];
	for(int i=L[x];i<=R[x];i++)
	{
		g[x][i]=g[x][i-1]+x;
		if(i==R[a[i]] && L[x]<L[a[i]])
			g[x][i]=max(g[x][i],g[x][L[a[i]]-1]+DFS(a[i]));
	}
	return f[x]=g[x][R[x]];
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n<<1;i++)
	{
		scanf("%d",&a[i]);
		if(L[a[i]]) R[a[i]]=i;
		else L[a[i]]=i;
	}
	L[0]=0,R[0]=(n<<1)+1;
	printf("%lld\n",DFS(0));
	return 0;
}
posted @ 2024-10-05 20:40  Jerrycyx  阅读(9)  评论(0编辑  收藏  举报