2020寒假集训专题一搜索E题 POJ - 1011

2020寒假集训专题一搜索E题POJ - 1011

原题链接:http://poj.org/problem?id=1011
专题链接:https://vjudge.net/contest/347799#problem/E

思路

本题看似无从下手,但稍微想想就能明白,答案必须为所有木棍长度总和的约数,这让dfs的做法成为了可能,我们先将小木棍降序排序,从最大的木棍的长度向上枚举即可。

但本题真正难的地方在于剪枝,最重要的一个剪枝在于——在判断了一个木棍不合题意后,其它与其长度相同的木棍肯定也是不符合题意的,因此,我们在将木棍按长度排序后,可以建一个数组n,用于存放与其长度不同的下一个木棍的位置,这样,我们再得知某一个木棍不合题意时可以自己tp到下一个有价值的木棍去,免去了大量的重复工作。

AC代码如下

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include <stack>
using namespace std;
int N,sum;
int arr[67];
int flag[67];//用于标记小木棍是否被用过
int n[67];//用于记录下一个不同长度的木棍的位置
int t;
int co;
bool cam(int a, int b)
{
	return a > b;
}
bool dfs(int nowpan, int k, int waitget, int wait)//分别表示现在判断的是否能作为答案的大木棍的长度,现在判断是否要取的小木棍的下标,要凑成大木棍的剩余长度,还剩下几根未取的小木棍
{	
	if ((waitget == 0) && (wait == 0))//当待取长度和剩余小木棍都为0时合题意
		return 1;
	if (waitget == 0)
	{
		waitget =nowpan;
		k = 1;
	}
	for(;k<=co&&k!=0;k++)//这里k!=0用来让使用n数组tp时,最后面几个没有下一个不同长度的木棍能正常结束,而不是在搜索一遍浪费时间(因为这几个元素未被赋值,指向的是0)
	{
		if (flag[k] != 0)//用过的小木棒肯定不能再用
			continue;
		if (waitget - arr[k] < 0)//满足此条件说明这个长度的小木棒不能用,直接tp到下一个长度不一样的小木棍那里
		{
			k = n[k];
		}
		else
		{
			flag[k] = 1;
			if (dfs(nowpan, k+1, waitget - arr[k], wait-1)==1)
				return 1;		
			flag[k] = 0;//如果能到这里的话,表示取arr【i】不成立,根据此信息进行回溯+剪枝
		   k = n[k];能到这里说明这个长度不可用,直接tp到下一个长度不一样的小木棍那里
		}
	}
	return 0}
int main()
{
	while (cin >> N)
	{
		memset(arr, 0, sizeof(arr));
          if (N == 0)
			break;
		sum = 0;
		co = 0;
		for (int i = 1; i <= N; i++)
		{
			scanf("%d", &t);
			if (t <= 50)//用于过滤小木棍长度大于50的
			{	++co;
				arr[co] = t;
				sum += arr[co];
			}
		}
		sort(arr + 1, arr + co+1,cam);//对木棍进行降序排序
		memset(n, 0, sizeof(n));
		for (int i = 1;i< co; i++)//用于寻找下一个不同长度的小木棒的位置
		{
			if (arr[i] != arr[i + 1])
			{
				t =i+1 ;
				for (int j = i; n[j] == 0 && j >=1; j--)
				{
					n[j] = t;	
				}
			}
		}
		for (int i = 0;; i++)//从最大小木棍的长度开始枚举
		{
			if (sum % (arr[1] + i) != 0)//答案必须为所有木棍长度总和的约数
				continue;
			memset(flag, 0, sizeof(flag));
			if (dfs(arr[1] + i,1, arr[1]+i,co))
			{
				printf("%d\n",arr[1]+i);
				break;
			}
		}
	}
	return 0;
}
### 回答1: b'fast end-to-end trainable guided filter'是一个快速端到端可训练的引导滤波器。它是一种用于图像增强和降噪的滤波器,将图像作为输入,并产生增强的输出图像。该滤波器采用网络架构,可以通过监督学习进行训练,从而使其能够自适应地对不同的图像进行增强和降噪。此技术的创新之处在于它的速度快,并且可以自动调整和学习不同图像的特征和参数,从而提高了图像增强和降噪的效果和传统方法的性能。 ### 回答2: 快速端到端可训练引导滤波器(fast end-to-end trainable guided filter)是一种基于深度学习的图像处理算法,它可以快速地进行图像去噪、图像增强等操作。引导滤波是一种经典的图像降噪算法,它的原理是利用附加信息对图像进行滤波。传统的引导滤波需要在滤波过程中手动设置许多参数,效率较低,而且不易学习。 该算法将引导滤波嵌入到深度神经网络中,使得其可以端到端地训练,自动学习最佳参数,可以根据实际情况自动调整参数,从而得到更好的降噪结果。同时,该算法还引入了快速可分离滤波器(fast separable filter)的思想,通过对滤波器进行一定的优化,使其更加高效。 该算法的训练过程分为两个步骤。首先,使用成对的清晰和模糊图像进行训练,学习引导滤波器中的参数。其次,在测试时,使用该滤波器对任意输入图像进行滤波。该算法可以应用于多种图像降噪应用,如图像去模糊、图像去噪等。 与传统的算法相比,fast end-to-end trainable guided filter 的效果更好,速度更快,具有更好的鲁棒性和可扩展性,可以处理更大的图像数据集。 总而言之,fast end-to-end trainable guided filter 是现代图像处理领域的一种重要算法,它将深度学习的优势与传统的引导滤波算法相结合,在图像降噪、图像增强等方面得到广泛的应用。 ### 回答3: Fast end-to-end trainable guided filter(简称FastGF)是一种基于全可训练的引导滤波器的算法。引导滤波器是一种基于一对输入——引导图像和输入图像,来使输入图像平滑的滤波器。FastGF是引导滤波器的一种新近提出的算法,与之前的引导滤波方法相比有着很多的优势。 首先,FastGF可以通过深度神经网络进行训练,从而使其具有更好的泛化能力。其次,FastGF的计算速度非常快,可以在实时环境下进行使用。最后,FastGF可以很容易地与传统的图像处理算法进行集成,从而提高了它的实用价值。 FastGF可以被用于很多的计算机视觉任务,比如超分辨率、风格迁移和图像去噪。例如在图像去噪中,可以将噪声图像作为引导图像,原始图像作为输入图像,通过计算这两个图像之间的权重来实现图像去噪的目的。 总之,FastGF是一种可广泛应用于图像处理领域的算法。它结合了神经网络和引导滤波器的优点,并具有快速的计算速度和高实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值