求助这个代码能得多少分
查看原帖
求助这个代码能得多少分
827018
zhouzihang1楼主2024/10/27 10:05

按照官方数据来看的话,大概能得 50 吗

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e2+10,M=1e5+10;
int n,a[M];

ll f[N][N][N];
ll dfs(int u,int l0,int l1)
{
	if(f[u][l0][l1]!=-1) return f[u][l0][l1];
	if(u>n) return 0;
	ll nxt=a[u]*(a[u]==a[l0]);
	f[u][l0][l1]=max(f[u][l0][l1],dfs(u+1,u,l1)+nxt);
	nxt=a[u]*(a[u]==a[l1]);
	f[u][l0][l1]=max(f[u][l0][l1],dfs(u+1,l0,u)+nxt);
	return f[u][l0][l1];
}
void solve1()
{
	for(int i=0;i<=n;i++)
		for(int j=0;j<=n;j++)
			for(int k=0;k<=n;k++)
				f[i][j][k]=-1;
	printf("%lld\n",dfs(1,0,0));
}

ll dp[M][11][11];
ll dfs1(int u,int l0,int l1)
{
	if(dp[u][l0][l1]!=-1) return dp[u][l0][l1];
	if(u>n) return 0;
	ll nxt=a[u]*(a[u]==l0);
	dp[u][l0][l1]=max(dp[u][l0][l1],dfs1(u+1,a[u],l1)+nxt);
	nxt=a[u]*(a[u]==l1);
	dp[u][l0][l1]=max(dp[u][l0][l1],dfs1(u+1,l0,a[u])+nxt);
	return dp[u][l0][l1];
}
void solve2()
{
	for(int i=0;i<=n;i++)
		for(int j=0;j<=10;j++)
			for(int k=0;k<=10;k++)
				dp[i][j][k]=-1;
	printf("%lld\n",dfs1(1,0,0));
}

void solve()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	if(n<=200) solve1();
	else solve2();
}
int main()
{
	int T;scanf("%d",&T);
	while(T--) solve();
	return 0;
}
2024/10/27 10:05
加载中...