深搜,#4 TLE,求怎么剪枝?
查看原帖
深搜,#4 TLE,求怎么剪枝?
393699
HXR123楼主2023/9/6 20:49
#include<bits/stdc++.h>
using namespace std;
int n,k,ans1=-1e9,ans2=1e9,a[150],b[50];
void dfs(int x,int t)
{
//	cout<<x<<" "<<t<<" "<<b[t] 
	if(t<0||x-b[t+1]>n||b[k]+n==b[t+1]||x>n+n)return;
	if(t==0)
	{
		int ans=0;
		b[0]=b[k]+n;
		for(int i=k-1;i>=0;i--)
		{
//			cout<<b[i]<<" ";
//			if(i==k)continue;
//			for(int j=b[i+1];j<b[i];j++)
//			ans3+=a[j];
			int l=b[i],r=b[i+1];
			int ans3=a[l-1]-a[r-1];
//			cout<<ans3<<" ";
			if(ans3<0)
			{
				ans3=0-ans3;
				ans3%=10;
				ans3=10-ans3;
			}
			if(ans3&&!ans)ans=1;
			ans3%=10;
			ans*=ans3;
		}
//			cout<<endl;
		ans1=max(ans1,ans);
		ans2=min(ans2,ans);
		return;
	}
	b[t]=x;
	if(!(t-1<0))dfs(x+1,t-1);
	b[t]=0;
	if(!(x+1-b[t+1]>n))dfs(x+1,t);
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		a[n+i]=a[i];
	}
	for(int i=1;i<=n+n;i++)a[i]+=a[i-1];
	dfs(1,k);
	printf("%d\n%d",ans2,ans1);
	return 0;
}
2023/9/6 20:49
加载中...