首先吐槽一下出题人没节操,相邻的距离算为0居然!
每次选最近的是存在bug的,数据我不记得了,是姚神出的,取最远的也是存在bug的,比如3 4 0 3 0 4 3 0 0 3 0 0,那么我能想到的方法也便只有搜索了,剪了两个枝,第一是每种必须出现偶数次否则无解,第二是配对的时候连续一段都可以配对,和其中任意一个配对结果不变,只需要搜索一次,少一个剪枝都是过不了的
#include <cstdio>
#include <cstring>
int a[1200],n,i,j,r;
bool p[1200];
bool dfs(int x)
{
if(x==0)return true;
if(p[x])return dfs(x-1);
int i,dis=0;
bool pd=0;
for(i=x-1; i>0; i--)
{
if(p[i])continue;
dis++;
if(dis>5)break;
if(a[i]==a[x])
{
if(!pd)
{
p[i]=1;
if(dfs(x-1))
{
return true;
}
p[i]=0;
pd=1;
}
}
else pd=0;
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)==1)
{
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
for(i=1; i<=n; i++)
{
r=0;
for(j=1; j<=n; j++)
if(a[i]==a[j])r++;
if(r&1)break;
}
if((n&1)||(r&1))
{
puts("0");
continue;
}
memset(p,0,sizeof(p));
printf("%d\n",dfs(n));
}
return 0;
}
解决特定字符串匹配问题
本文探讨了一种通过搜索算法解决特定字符串中字符成对出现的问题,并实现了一个C++程序来验证解决方案的有效性。文章首先指出常规方法存在的缺陷,然后介绍了一种包含两个剪枝条件的搜索策略:确保每种字符出现偶数次且可以将连续相同字符视为已配对。通过这些策略提高了算法效率。
1220

被折叠的 条评论
为什么被折叠?



