[ACM] hdu 4403 A very hard Aoshu problem (DFS暴搜数字)

来源:互联网 发布:淘宝交易订单生成器 编辑:程序博客网 时间:2024/06/06 23:56

A very hard Aoshu problem



Problem Description
Aoshu is very popular among primary school students. It is mathematics, but much harder than ordinary mathematics for primary school students. Teacher Liu is an Aoshu teacher. He just comes out with a problem to test his students:

Given a serial of digits, you must put a '=' and none or some '+' between these digits and make an equation. Please find out how many equations you can get. For example, if the digits serial is "1212", you can get 2 equations, they are "12=12" and "1+2=1+2". Please note that the digits only include 1 to 9, and every '+' must have a digit on its left side and right side. For example, "+12=12", and "1++1=2" are illegal. Please note that "1+11=12" and "11+1=12" are different equations.
 

Input
There are several test cases. Each test case is a digit serial in a line. The length of a serial is at least 2 and no more than 15. The input ends with a line of "END".
 

Output
For each test case , output a integer in a line, indicating the number of equations you can get.
 

Sample Input
1212123456661235END
 

Sample Output
220
 

Source
2012 ACM/ICPC Asia Regional Jinhua Online


解题思路:

对DFS还是很头疼,搞不懂它是怎么运行的,有时候看着别人写的DFS看着看着就晕了,还得多做做这类的题目,上次网赛就有一道DFS暴搜,不会啊。。。。

本题的题意为给定一个由数字组成的字符串,向里面加入一个等号,和任意个加号,使得等式成立,问一共有多少种方案。

思路为枚举等号出现的位置,用equ表示,则1<=equ<=len-1,  也就是把等号加在第equ个数字后面,紧跟着第equ个数字。然后先DFS等号左边所有可能出现的情况,对应每个左边所出现的和lsum,再DFS等号右边所有可能出现的情况rsum,如果 rsum==lsum,那么有一种方案可行。

总结:通过DFS来搜出等号左边所有的状态,每一种状态压入栈中,然后从栈中取状态,再去DFS等号右边所有的状态,状态相等,则有一种方案可行。

#include <iostream>#include <string.h>#include <stdio.h>using namespace std;char str[17];int val[17][17];int len;int ans;void cal(){    memset(val,0,sizeof(val));    for(int i=1;i<=len;i++)        for(int j=i;j<=len;j++)    {        for(int k=i;k<=j;k++)            val[i][j]=val[i][j]*10+(str[k]-'0');    }}void dfsr(int lsum,int pos,int rsum)//dfs等号后边可能出现的情况{    if(pos>len)    {        if(rsum==lsum)            ans++;        return;    }    for(int k=pos;k<=len;k++)//注意是<=,因为最后一位也属于等号后边        dfsr(lsum,k+1,rsum+val[pos][k]);//注意是k+1}void dfsl(int equ,int pos,int lsum)//dfs等号左边可能出现的情况,每种情况对应一个lsum(等号左边的和){    if(pos>equ)//当等号左边的数字的位置大于等号的位置时,搜索等号后边        dfsr(lsum,equ+1,0);    for(int k=pos;k<=equ;k++)//注意是<=,equ代表的是等号加在第equ个数字后面        dfsl(equ,k+1,lsum+val[pos][k]);}int main(){    while(cin>>(str+1)&&str[1]!='E')    {        ans=0;        len=strlen(str+1);        cal();        int equ;        for(equ=1;equ<=len-1;equ++)            dfsl(equ,1,0);        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鑫和陌车骗我钱怎么办 社会人加你qq怎么办 有人问你加qq怎么办 住酒店遇到被色情诈骗怎么办 怎么办我陷入感情骗局了 移动手机卡被强制停机怎么办 诚e赊套现被骗了怎么办 钻戒小了怎么办小窍门 爱用商城逾期了怎么办 工程骗局洗脑了怎么办 还网贷客服电话打不通怎么办 中信客服电话打不通怎么办 亚马逊客服电话打不通怎么办 安卓软件闪退怎么办? 吃鸡麦克风炸麦怎么办 美版iphone屏摔了怎么办 天地荣域四十后怎么办 淘宝拍下商品不付款怎么办 淘宝买东西取消订单淘金币怎么办 淘宝淘金币快过期了怎么办 公众号密码忘了怎么办 酷狗直播个入驻粉丝少怎么办 健康证预约显示未接收怎么办 在互惠车贷逾期怎么办 天天中彩票怎么登陆不了怎么办 正宇新商城不能提现怎么办 融e购买完不发货怎么办 婴儿肚子胀气肚脐凸出来怎么办 微信商城买东西被骗了怎么办 拼多多商家不发货怎么办 鞋上的饰品掉了怎么办 饰品上的钻掉了怎么办 dota2饰品被好友礼物怎么办 dota2接收的礼物打不开怎么办 英雄联盟线上被压制怎么办 云联商城的钱怎么办 高顿财经不退款怎么办 拼多多连不上网怎么办 拼多多评分太低怎么办 拼多多限制提现怎么办 手机收不到验证码怎么办