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  }

 

 


你可能感兴趣的:(2012)