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;
}
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/18448448