暴力枚举,dfs(三角形篱笆,HDU 4277)

讲道理,真的有些莫名其妙,按理说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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值