题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4403
1212 12345666 1235 END
2 2 0
//思路:首先暴力出这个字符串中任意两个位置的表示的数的大小。
代码如下:
#include <cstdio>
#include <cstring>
char s[47];
int len,ans;
int Num[47][47];
void dfs_r(int lsum,int pos,int rsum)
{
if(pos==len)
{
if(lsum==rsum)
ans++;
return;
}
for(int i = pos; i < len; i++)
dfs_r(lsum,i+1,rsum+Num[pos][i]);
}
void dfs_l(int k,int mid,int lsum)
{
if(k==mid)
{
dfs_r(lsum,mid,0);
}
for(int i = k; i < mid; i++)
{
dfs_l(i+1,mid,lsum+Num[k][i]);
}
}
int main()
{
while(~scanf("%s",s))
{
if(strcmp(s,"END")==0)
break;
memset(Num,0,sizeof(Num));
len = strlen(s);
ans = 0;
for(int i = 0; i < len; i++)
{
for(int j = i; j < len; j++)
{
for(int k = i; k <= j; k++)
Num[i][j]=Num[i][j]*10+(s[k]-'0');
// 获得 位置为 i,j 的数的值
//printf("Num[%d][%d]: %d\n",i,j,Num[i][j]);
}
}
for(int i = 1; i < len; i++)//枚举等号的位置
{
dfs_l(0,i,0);
}
printf("%d\n",ans);
}
return 0;
}
HDU 4403 A very hard Aoshu problem(DFS+暴力)
原文地址:http://blog.csdn.net/u012860063/article/details/39104371