求DFS优化技巧
  • 板块学术版
  • 楼主wdl_
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/4/17 17:33
  • 上次更新2023/10/28 03:26:59
查看原帖
求DFS优化技巧
648843
wdl_楼主2022/4/17 17:33

LinkLink

TLE 60分:

#include<bits/stdc++.h>
using namespace std;
int t,n,d,k,a[100005][5],maxx=0,x1,y2;
bool bz[100005];
int read(){
	int x = 0, f = 1;
	char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-'){
			f = -1;
		}
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x*f;
}
void dfs(int s,int x,int js,int l)
{
    if(s+n-x-1<maxx)return;
    if(x>=n)
    {
        if(maxx<s)
        {
            maxx=s;
            x1=l;
            y2=x-1;
        }
        return;
    }
    for(int i=0;i<d;i++)
    {
        if(bz[a[x][i]])
        {
            dfs(s+1,x+1,js,l);
            return;
        }
    }
    if(k<=js)
    {
        if(maxx<s)
        {
            maxx=s;
            x1=l;
            y2=x-1;
        }
        return;
    }
    for(int i=0;i<d;i++)
    {
        bz[a[x][i]]=1;
        dfs(s+1,x+1,js+1,l);
        bz[a[x][i]]=0;
    }
}
int main()
{
    freopen("lucky.in","r",stdin);
    freopen("lucky.out","w",stdout);
    t=read();
    for(int i=0;i<t;i++)
    {
        n=read();d=read();k=read();
        //memset(a,0,sizeof(a));
        for(int k=0;k<n;k++)
        	for(int j=0;j<d;j++)
                a[k][j]=read();
        maxx=0;
        for(int k=0;k<n;k++)
        {
            if(n-k-1<maxx)break;
        	dfs(1,k,0,k);
        }
        printf("Case #%d: %d %d\n",i+1,x1,y2);
    }
}

求优化技巧QwQQwQ

2022/4/17 17:33
加载中...