dfs+剪枝+记忆化60分TLE求助(玄关)
查看原帖
dfs+剪枝+记忆化60分TLE求助(玄关)
1199534
ycy1124楼主2024/4/28 12:58
#include<bits/stdc++.h>

using namespace std;

int a[100001];

long long qz[100001];

int bj=1;

long long jy[100001];

long long jy1[100001];

long long b[100001];

long long js;

int n;

void read(int &x)

{

	x=0;

	char ch=getchar();

	while(ch>'9'||ch<'0')

	{

		ch=getchar();

	}

	while(ch>='0'&&ch<='9')

	{

		x*=10;

		x+=ch-'0';

		ch=getchar();

	}

}

void dfs(int i,long long zs)

{

	if(jy[i]==-1)

	{

		jy[i]=zs;

		jy1[i]=bj;

	}

	else if(zs<=jy[i]&&bj<=jy1[i])

	{

		return;

	}

	if(bj<i||i>n)

	{

		js=max(zs,js);

		return;

	}

	if(zs+qz[n]-qz[i-1]<=js)

	{

		return;

	}

	if(a[i]>n)

	{

		zs+=(qz[n]-qz[i]);

		js=max(zs,js);

		return;

	}

	if(a[i]!=0){

		dfs(i+1,zs+a[i]);

		if(bj<a[i]+i){

			int z=bj;

			bj=i+a[i];

			dfs(i+1,zs);

			bj=z;

		}

	}

	else

	{

		dfs(i+1,zs+a[i]);

	}

}

int main()

{

	int T;

	read(T);

	for(int i=1;i<=T;i++)

	{

		js=0;

		read(n);

		for(int i=1;i<=n;i++)

		{

			jy[i]=-1;

			jy1[i]=-1;

			read(a[i]);

			qz[i]=a[i]+qz[i-1];

		}

		dfs(1,0);

		printf("%lld\n",js);

	}

	return 0;

}
2024/4/28 12:58
加载中...