讲道理,真的有些莫名其妙,按理说dfs带的参数少应该更快的,因为不用拷贝那么多参数,直接修改全局变量或传递指针。但事实上带参数多反而快300ms,真的快很多了,时间限制1500ms,带参1000ms,不带参1300ms。好奇怪啊。。。难道是地址太远,寻址太慢?????
还有。。如果你的代码是1500ms左右的话,过不过还是个概率问题,运气好就过,运气不好就不过。真是醉了。。
但是减少函数的调用还是能显著加快速度的。
所以以后写代码还是尽量把细节写好一点,也许真的不是你算法出了问题,而是某些细节处理得不够好了。
一开始超时,修改了一些细节就过了。
1、判断是否ok不再单独写一个函数,直接带dfs内完成。
2、map改为set。
3、一开始还将a,b,c升序排序后再判断,事实上不是不是升序直接丢弃就好了。
4、判重只需要一个make_pair(a,b)就够了,不需要带上c。
5、一开始还写了个结构体,简直浪费时间。
6、把long long改为int,这个估计没啥用。
n<=15,果断就暴力枚举了O(3^n)。
代码
#include<stdio.h>
#include<algorithm>
#include<set>
using namespace std;
int fen[20];
int ans;
int n;
typedef pair<int,int>pii;
set<pii>s;
void dfs(int cur,int a,int b,int c)
{
if(cur>n)
{
if(a==0||b==0||c==0) return;
if(a>c||b>c||a>b) return;
pii p=make_pair(a,b);
if(s.count(p)) return;
s.insert(p);
if(a+b<=c) return;
ans++;
return;
}
dfs(cur+1,a+fen[cur],b,c);
dfs(cur+1,a,b+fen[cur],c);
dfs(cur+1,a,b,c+fen[cur]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ans=0;
s.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&fen[i]);
dfs(1,0,0,0);
printf("%d\n",ans);
}
return 0;
}