HDU4403 DFS

题意:给定一串数字,在这些数字钟插入一些‘+’或者'=' 使得两边相等

思路:首先暴力出这个字符串中任意两个位置的表示的数的大小。。。。

然后枚举等号的位置,两边进行dfs

(dfs一开始实在是没思路。。借鉴http://blog.csdn.net/kk303/article/details/8008058)

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<algorithm>

 4 using namespace std;

 5 const int maxn = 24;

 6 char a[ maxn ];

 7 int num[ maxn ][ maxn ];

 8 int ans,len;

 9 int get_num( int x,int y ){

10     int sum=0;

11     int tmp=1;

12     for( int i=y;i>=x;i-- ){

13         sum+=( ( a[i]-'0' )*tmp );

14         tmp*=10;

15     }

16     return sum;

17 }

18 void dfs_right( int y,int pre_sum,int now_sum,int mid ){

19     if( y>len ){

20         if( pre_sum==now_sum )

21             ans++;

22         return ;

23     }

24     for( int k=y;k<=len;k++ ){

25         dfs_right( k+1,pre_sum,now_sum+num[y][k],mid );

26     }

27 }

28 void dfs_left( int x,int sum,int mid ){

29     //if( sum>num[ mid ][ len ] )

30         //return ;//这个剪枝是错误的!!!

31     if( x>=mid ) {

32         //if( mid==6 )

33             //printf("sum:%d\n",sum);//it is just for test

34         dfs_right( mid,sum,0,mid );//pos,pre_sum,now_sum,mid

35     }

36     for( int k=x;k<mid;k++ )

37         dfs_left( k+1,sum+num[x][k],mid );

38 }

39 int main(){

40     while( scanf("%s",a+1)!=EOF ){

41         if( a[1]=='E' ){

42             break;

43         }

44         len=strlen( a+1 );

45         memset( num,0,sizeof( num ) );

46         for( int i=1;i<=len;i++ ){

47             for( int j=i;j<=len;j++ ){

48                 num[ i ][ j ]=get_num( i,j );

49             }

50         }// 获得 位置为 i,j 的数的值

51         ans=0;

52         for( int mid=2;mid<=len;mid++ ){//枚举等号的位置

53             dfs_left( 1,0,mid );//pos,now_num,mid

54         }

55         printf("%d\n",ans);

56     }

57     return 0;

58 }

 

你可能感兴趣的:(HDU)