HDU 4277 USACO ORZ(DFS)
用DFS就可以过,判重的时候用map去重的,因为每一条边是最大是10000,用150000进制的3位数就可以表示出现的状态。
数据水了。。。我的代码用的是15000进制就A了。。。卡线过的1300+ms
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <cstdlib> 6 #include <map> 7 using namespace std; 8 int ans,p[16],o[16],n,sum[16]; 9 map <__int64,bool> key; 10 void dfs(int x,int a,int b,int c) 11 { 12 if(x > n) 13 { 14 if(a&&b&&c&&a <= b&&b <= c&&!key[15000*15000*a+15000*b+c]&&a+b > c) 15 { 16 key[15000*15000*a+15000*b+c] = 1; 17 ans ++; 18 } 19 return ; 20 } 21 if(c + sum[x] <= b||b + sum[x] <= a||a+b+sum[x] <= c) 22 return ; 23 dfs(x+1,a+p[x],b,c); 24 dfs(x+1,a,b+p[x],c); 25 dfs(x+1,a,b,c+p[x]); 26 } 27 int main() 28 { 29 int i,t; 30 scanf("%d",&t); 31 while(t--) 32 { 33 ans = 0; 34 key.clear(); 35 scanf("%d",&n); 36 for(i = 1; i <= n; i ++) 37 { 38 scanf("%d",&p[i]); 39 sum[i] = sum[i-1]+p[i]; 40 } 41 dfs(1,0,0,0); 42 printf("%d\n",ans); 43 } 44 return 0; 45 }