hdu 4277 2012长春赛区网络赛 dfs+hashmap ***

hashmap判重大法好

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 const int MAXN=1005;
16 int n,m,tt;
17 int sum=0,a[MAXN];
18 const int HASH = 1000007;
19 struct HASHMAP
20 {
21     int head[HASH],next[HASH],size;
22     int state[HASH][3];
23     int hash(int a,int b,int c)
24     {
25       return (((a*7+b)*7+c)*7)%HASH;  //131
26     }
27     void init()
28     {
29         size = 0;
30         memset(head,-1,sizeof(head));
31     }
32     int insert(int a,int b,int c)
33     {
34         int h = hash(a,b,c);
35         for(int i = head[h]; i != -1;i = next[i])
36             if(a == state[i][0]&&b == state[i][1]&&c == state[i][2])
37             {
38                 return 1;
39             }
40         state[size][0]=a,state[size][1]=b,state[size][2]=c;
41         next[size] = head[h];
42         head[h] = size++;
43         return 0;
44     }
45 } H1;
46 bool check(int a1,int a2,int a3)
47 {
48     if(a1+a2>a3&&a1+a3>a2&&a2+a3>a1)   return 1;
49     else return 0;
50 }
51 void dfs(int a1,int a2,int a3,int pos)
52 {
53     if(a3>sum/3)    return;
54     if(pos>=n)
55     {
56         if(a1==0||a2==0||a3==0) return;
57         if(check(a1,a2,a3)&&a1>=a2&&a2>=a3)
58         {
59             H1.insert(a1,a2,a3);
60         }
61         return;
62     }
63     dfs(a1+a[pos],a2,a3,pos+1);
64     dfs(a1,a2+a[pos],a3,pos+1);
65     dfs(a1,a2,a3+a[pos],pos+1);
66 }
67
68 int main()
69 {
70     int i,j,k,ca=1;
71     #ifndef ONLINE_JUDGE
72     freopen("1.in","r",stdin);
73     #endif
74     scanf("%d",&tt);
75     while(tt--)
76     {
77         H1.init();
78         sum=0;
79         scanf("%d",&n);
80         for(i=0;i<n;i++)    scanf("%d",a+i),sum+=a[i];
81         dfs(0,0,0,0);
82         printf("%d\n",H1.size);
83     }
84 }
时间: 2024-08-05 06:52:31

hdu 4277 2012长春赛区网络赛 dfs+hashmap ***的相关文章

hdu 4272 2012长春赛区网络赛 dfs暴力 ***

总是T,以为要剪枝,后来发现加个map就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const

hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***

新模板 1 /* 2 HDU 4273 Rescue 3 给一个三维凸包,求重心到表面的最短距离 4 模板题:三维凸包+多边形重心+点面距离 5 */ 6 7 #include<stdio.h> 8 #include<algorithm> 9 #include<string.h> 10 #include<math.h> 11 #include<stdlib.h> 12 using namespace std; 13 const int MAXN=

hdu 4274 2012长春赛区网络赛 树形dp ***

设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10

hdu 4741 2013杭州赛区网络赛 dfs ***

起点忘记录了,一直wa 代码写的很整齐,看着很爽 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 con

hdu 4278 2012天津赛区网络赛 数学 *

8进制转为10进制 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f

hdu 4751 2013南京赛区网络赛 二分图判断 **

和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的 是 hdu 2444 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace st

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4025 2011上海赛区网络赛E 压缩 ***

直接T了,居然可以这么剪枝 题解链接:点我 1 #include<cstdio> 2 #include<map> 3 #include<cstring> 4 #define ll __int64 5 using namespace std; 6 ll a[23],x[23][5],ans; 7 map<ll,ll>p; 8 void dfs(int d,int n,ll res,int f) 9 { 10 if(d==n){ 11 if(f) p[res]+

hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***

题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以这条边忽略,然后继续遍历,此时可以通过未遍历的边返回pre 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath