hdu 4403 A very hard Aoshu problem (暴力枚举 2012 金华网络赛 )

http://acm.hdu.edu.cn/showproblem.php?pid=4403

题意:

给定 一个 数字字符串 ,在这些 字符间添加  一个 加号 和 多个 等号 求 有多少种 方法 得到 等式  使得左右相等 如 1212

可以  分解为

12=12" and "1+2=1+2".

题解 :

  暴力枚举 ,因为i额 数据并不大 最多 15 位数 所以 枚举就可以 

  1 #include<cstdio>
  2  #include<cstring>
  3  #include<cmath>
  4  #include<iostream>
  5  #include<algorithm>
  6  #include<set>
  7  #include<map>
  8  #include<queue>
  9  #include<vector>
 10  #include<string>
 11  #define Min(a,b) a<b?a:b
 12  #define Max(a,b) a>b?a:b
 13  #define CL(a,num) memset(a,num,sizeof(a));
 14  #define eps  1e-12
 15  #define inf 100000000
 16  #define mx 1<<60
 17  #define ll   __int64
 18  const double pi  = acos(-1.0);
 19  const int maxn = 500000;
 20  using namespace std;
 21  int a[20] ;
 22  int p[maxn],q[maxn] ;
 23  int cnt1,cnt2;
 24  void dfs1(int x,int num,int sum,int pre)
 25  {
 26 
 27      if(num == 0)
 28      {
 29          if(pre == -1) pre = 0;
 30          p[cnt1++] = sum  + pre;
 31         
 32          return ;
 33      }
 34      if(pre == -1)// 表示 是 这个数 前面 插入了一个 +
 35      {
 36 
 37            dfs1(x + 1,num - 1,sum, a[x]);// 
 38 
 39 
 40      }
 41      else
 42      {
 43           dfs1(x + 1,num - 1,sum,pre*10 + a[x]);//前面不是  + 两种选择
 44 
 45          dfs1(x,num,sum + pre,-1) ;
 46      }
 47 
 48 
 49 
 50  }
 51  void dfs2(int x,int num,int sum,int pre)
 52  {
 53      if(num == 0)
 54      {
 55         if(pre == -1) pre = 0;
 56 
 57          q[cnt2++] = sum  + pre ;
 58          return ;
 59      }
 60       if(pre == -1)
 61      {
 62 
 63            dfs2(x + 1,num - 1,sum, a[x]);
 64 
 65 
 66      }
 67      else
 68      {
 69           dfs2(x + 1,num - 1,sum,pre*10 + a[x]);
 70 
 71           dfs2(x,num,sum + pre,-1) ;
 72      }
 73  }
 74  int main()
 75  {
 76      int i , j,k ;
 77      char c[20] ;
 78      while(scanf("%s",c)!=EOF)
 79      {
 80          if(strcmp(c,"END") == 0break ;
 81 
 82          int len = strlen(c);
 83          for(i = 0; i < len;i++)
 84          {
 85              a[i] = c[i] - '0' ;
 86          }
 87 
 88          int ans= 0 ;
 89          for(i = 1 ; i <= len - 1;i++)
 90          {   cnt1 = 0;
 91              cnt2 = 0 ;
 92              dfs1(0,i,0,-1);
 93 
 94              dfs2(i,len - i,0,-1) ;
 95              for(j = 0 ; j< cnt1;j++)
 96              {
 97                  for(k = 0;  k< cnt2;k++)
 98                  {
 99                      if(p[j] == q[k] )ans++;
100                  }
101              }
102 
103 
104 
105          }
106 
107 
108 
109 
110          printf("%d\n",ans) ;
111 
112      }
113  }

 

 


posted @ 2012-09-23 10:49  Szz  阅读(275)  评论(0)    收藏  举报