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 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2939099.html