【ZCMU1795】wjw的hard problem(dfs)

题目链接

1795: wjw的hard problem

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 70  Solved: 22
[Submit][Status][Web Board]

Description

ly最近给wjw出了一个很难很难的题目,ly给了wjw一串数字,wjw可以在这串数字中间插入一个“=”使得这串数字变成一个等式,然后他还可以插入不限个数个"+",比如“945”可以分成9=4+5,“3434”可以分成“34=34”或者“3+4=3+4”两个等式,因为数字长度一增加,wjw就不会算了,现在他请你帮他算一下每个数字串有能分成多少种等式?

Input

每组测试数据有多组,每组一个数字串,长度保证(2<=len<=20),输入以0结尾

扫描二维码关注公众号,回复: 3503437 查看本文章

Output

对每组数据输出,每组一行,包含一个整数,表示答案

Sample Input

1212

1235

0

Sample Output

2

0

HINT

Source

jnxxhzz

【解题思路】

1.枚举等号的位置,等号的位置只可能在0~len-1个字符的后面

2.sum1为的等号左边的和,sum2为等号右边的和,x为当前所计算到的字符的值。

3.因为考虑到每次遍历到的字符是可以和上一个字符组合的,所以有个x=x*10+s[deep]-'0'的操作。当遍历到一个等号时,当前字符不能再往下传和下一个字符组合了,所以需要把当前的值加到sum1上。还有一种情况是当遍历到最后一个字符时,没有下一个字符了,所以必须把当前的值加到sum2上。

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
char s[25];
int len,ans,pos;
void dfs(int deep,LL sum1,LL sum2,LL x)
{
    if(deep>=len)
    {
        if(sum1==sum2)ans++;
        return;
    }
    x=x*10+s[deep]-'0';
    if(deep==pos)dfs(deep+1,sum1+x,0,0);//等号位置
    else
    {
        if(deep!=len-1)dfs(deep+1,sum1,sum2,x);//该位字符和上一位字符组合的情况
        if(deep<pos)dfs(deep+1,sum1+x,0,0);//等号左边
        else dfs(deep+1,sum1,sum2+x,0);//等号右边
    }
}
int main()
{
    while(~scanf("%s",s))
    {
        len=strlen(s);
        if(len==1 && s[0]=='0')return 0;
        ans=0;
        for(int i=0;i<len-1;i++)
        {
            pos=i;
            dfs(0,0,0,0);
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/82960900
今日推荐