hdu 4403 dfs

巨麻烦的模拟题orz。。。。

先确定等号的位置,然后两层dfs,分别算等号前面的和后面的,再比较

话说这题竟然不开long long都能水过

  1 #include <iostream>
  2 #include<cstring>
  3 using namespace std;
  4 int ANS,ansx,ansy,T,l;
  5 string s;
  6 int nx[1000],ny[1000],ax[1000],ay[1000],a[1000];
  7 int lx,ly;
  8
  9 int calcx()
 10 {
 11     //ax[1..lx-1]
 12     //nx[1..lx]
 13     int tmpn=nx[1];
 14     int tmpa=0;
 15     for(int i=1;i<=lx-1;i++)
 16     {
 17         if(ax[i]==1)
 18         {
 19             tmpa+=tmpn;
 20             tmpn=nx[i+1];
 21         }
 22         else
 23         {
 24             tmpn=tmpn*10+nx[i+1];
 25         }
 26     }
 27     tmpa+=tmpn;
 28     return tmpa;
 29 }
 30
 31 int calcy()
 32 {
 33     //ay[1..ly-1]
 34     //ny[1..ly]
 35     int tmpn=ny[1];
 36     int tmpa=0;
 37     for(int i=1;i<=ly-1;i++)
 38     {
 39         if(ay[i]==1)
 40         {
 41             tmpa+=tmpn;
 42             tmpn=ny[i+1];
 43         }
 44         else
 45         {
 46             tmpn=tmpn*10+ny[i+1];
 47         }
 48     }
 49     tmpa+=tmpn;
 50     return tmpa;
 51 }
 52
 53 void dfsy(int y)
 54 {
 55     if(y==ly)
 56     {
 57         //cout<<nx[1]<<" ";
 58         //for(int i=1;i<=lx-1;i++)  cout<<char(ax[i]+‘A‘)<<" "<<nx[i+1]<<" ";
 59         //cout<<"----";
 60         //cout<<ny[1]<<" ";
 61         //for(int i=1;i<=ly-1;i++)  cout<<char(ay[i]+‘A‘)<<" "<<ny[i+1]<<" ";
 62
 63         ansy=calcy();
 64         //cout<<"  "<<ansx<<"=="<<ansy<<" ";
 65         if(ansy==ansx)
 66         {
 67             ANS++;
 68         //    cout<<" OK! ";
 69         }
 70         //cout<<endl;
 71     }
 72     else
 73     {
 74         ay[y]=1;
 75         dfsy(y+1);
 76         ay[y]=0;
 77         dfsy(y+1);
 78     }
 79 }
 80
 81 void dfsx(int x)
 82 {
 83     if(x==lx)
 84     {
 85         ansx=calcx();
 86         dfsy(1);
 87     }
 88     else
 89     {
 90         ax[x]=1;        //add a plus after ax[x]
 91         dfsx(x+1);
 92         ax[x]=0;
 93         dfsx(x+1);
 94     }
 95 }
 96
 97 int main()
 98 {
 99     while(cin>>s)
100     {
101         if(s=="END")    break;
102         l=s.length();
103         ANS=0;  ansx=0;  ansy=0;
104         for(int i=1;i<=l;i++)
105             a[i]=s[i-1]-‘0‘;
106         for(int eq=1;eq<=l-1;eq++)     //add equal after a[eq]
107         {
108             memset(nx,0,sizeof(nx));
109             memset(ny,0,sizeof(ny));
110             for(int i=1;i<=eq;i++)      nx[i]=a[i];
111             lx=eq;
112             for(int i=eq+1;i<=l;i++) ny[i-eq]=a[i];
113             ly=l-eq;
114             dfsx(1);
115         }
116         cout<<ANS<<endl;
117     }
118
119     return 0;
120 }

时间: 2024-11-08 22:52:39

hdu 4403 dfs的相关文章

hdu 4403 A very hard Aoshu problem

hdu 4403 A very hard Aoshu problem 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4403 DFS 这几天集训,一天也就写个4题,被虐哭QAQ.回寝室后游少说解搜索就大胆搜,最后剪个枝就好了Orz,然后我就尝试解这题(剪枝要风骚).我先枚举等号的位置equ,然后搜索加号add的位置,然后主要的剪枝:如果等号左边运算后小于等号右边各个位上的数的和,那么后面的肯定不满足条件,右边同理.最后要小心爆int,这里吃了很多W

hdu 4109 dfs+剪枝优化

求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己增加的)出发,0到1~n个节点之间的距离为1,mt[i]表示从0点到第i个节点目前所得的最长路径 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; const

HDU 1015 dfs回溯

题目真长.....看了好长时间才看懂.. 就是给你一个32位数字和一个最多15个字符的字符串,从字符串中选出5个字符,若满足题中给的那个式子,输出字典序最大的那5个字符,若不满足,输出no solution. 为了解决字典序问题,在输入字符串后,把字符串按从大到小排一下序,搜索一下若满足条件输出即可. 贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <

hdu 1312 DFS算法简单题

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 此题与油田那题很像是练习深搜的好题,题意是从"@"开始,遍历整个图,找到连接的 "."有多少个 但要考虑变化,简单处理下就行了,主要是斜角的不要了,而且判断结束方式也不一样 具体看代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

HDU 5143 DFS

分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合法能否进入下层递归来减少内存消耗. /** @Date : 2017-09-27 15:08:23 * @FileName: HDU 5143 DFS.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link :

HDU 1045 DFS暴搜

Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6229    Accepted Submission(s): 3506 Problem Description Suppose that we have a square city with straight streets. A map of a city is a s

hdu 2212 DFS(水题)

DFS Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4923    Accepted Submission(s): 3029 Problem Description A DFS(digital factorial sum) number is found by summing the factorial of every digit

hdu - 4403 - A very hard Aoshu problem(dp + dfs + map + 乘法原理)

题意:给出一串数字字符(长度在[2, 15]),现要在其中加一个 "=",不加或加一些 "+",问成立的等式有多少条? 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4403 -->>数据量较小,暴力吧.. 1.dp预处理出任意两个字符间的数值大小 2.枚举 = 的位置,分别对 = 的左边.右边各dfs一次,并记录各个数出现的次数 3.根据乘法原理求组合数 #include <cstdio> #

HDU 4403 A very hard Aoshu problem(dfs爆搜)

http://acm.hdu.edu.cn/showproblem.php?pid=4403 题意: 给出一串数字,在里面添加一个等号和多个+号,使得等式成立,问有多少种不同的式子. 思路: 数据量比较小,直接dfs爆搜答案即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<map> 6 using nam