原题:HDU-4403
先用递推列出所有数字组合,然后再用DFS尝试匹配各种组合
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s[20];
long long a[20][20];
int L;
int sum;
void dfs(int start,int end,long long v,long long p[]) {
if(start>end) {
p[++L]=v;
return ;
}
for(int i=start; i<=end; i++)
dfs(i+1,end,v+a[start][i],p);
}
void judge(long long left[],long long right[]){
int ii=left[0],jj=right[0];
for(int i=1;i<=ii;i++)
for(int j=1;j<=jj;j++)
if(left[i]==right[j])
sum++;
}
int main() {
while(~scanf("%s",s)) {
if(!strcmp(s,"END"))
break;
memset(a,0,sizeof(a));
int l=strlen(s);
for(int i=0; i<l; i++) {
a[i][i]=s[i]-'0';
for(int j=i+1; j<l; j++)
a[i][j]=a[i][j-1]*10+s[j]-'0';
}
sum=0;
long long left[100000],right[100000];
for(int i=0; i<l-1; i++) {
L=0;
dfs(0,i,0,left);
left[0]=L;
L=0;
dfs(i+1,l-1,0,right);
right[0]=L;
judge(left,right);
}
printf("%d\n",sum);
}
return 0;
}