hdu 4403 爆搜

题意:给一串数字,在其间加入若干加号和一个等号,问使等式成立的方案总数

if the digits serial is "1212", you can get 2 equations, they are "12=12" and "1+2=1+2".

 

一看就是搜索,但是不太好写,还是参考了kuang神和这里

的大神写的

 

先枚举左边的所有和的情况,然后判断右边是否存在相等的情况

 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=20;

16 char s[MAXN];

17 int n,m,tt;

18 ll sum[MAXN][MAXN],len,ans,pos;

19 void dfs2(int i,ll d,ll pre)

20 {

21     if(i>len)

22     {

23         if(pre==d)  ans++;

24         return;

25     }

26     for(int k=i;k<=len;k++)

27     {

28         dfs2(k+1,d+sum[i][k],pre);

29     }

30     return;

31 }

32 void dfs1(int i,ll d)

33 {

34     if(i>pos)   dfs2(pos+1,0,d);

35     for(int k=i;k<=pos;k++) //在第k个位置上放置加号

36     {

37         dfs1(k+1,d+sum[i][k]);

38     }

39     return;

40 }

41 int main()

42 {

43     int i,j,k;

44     #ifndef ONLINE_JUDGE

45     freopen("1.in","r",stdin);

46     #endif

47     while(scanf("%s",s+1))

48     {

49         ans=0;

50         if(s[1]=='E')   break;

51         len=strlen(s+1);

52         for(i=1;i<=len;i++)

53         {

54             for(j=i;j<=len;j++)

55             {

56                 sum[i][j]=0;

57                 for(k=i;k<=j;k++)   sum[i][j]=sum[i][j]*10+s[k]-'0';

58             }

59         }

60         for(pos=1;pos<len;pos++)

61         {

62             dfs1(1,0);

63         }

64         printf("%I64d\n",ans);

65     }

66 }

 

你可能感兴趣的:(HDU)