HDU 4430 A very hard Aoshu problem DFS 数学式子
2013-08-06 14:45
309 查看
比赛结束后,听人家说才知道是个dfs的题,枚举=的位置,然后看两边的结果有没有相同的,有就ans++,等号两边的每个位置要么放上+,要么不放。另外因为题目中说1+11=12和11+1=12是2种,所以不能只存等号左边的结果12,还要存能得到的12的个数,我直接用vector存的,扫面一遍有相同的就加1.这个dfs写了两三个小时,代码能力还是太差了。
#include<iostream> #include<cstdio> #include<cstdlib> #include<vector> #include<cmath> #include<set> #include<cstring> #include<algorithm> #define MAXN 500010 using namespace std; char str[20]; bool save[20]; int ans,i; set<int>st1; vector<int>st; void dfs(int cur,int end,int sum) { if(cur==end) { int temp=cur; while(save[temp]==false&&temp>=0) temp--; int num=0; for(int j=++temp; j<=cur; j++) num=num*10+str[j]-'0'; sum+=num; st.push_back(sum); return ; } save[cur]=true; int num=0; int temp=cur-1; while(save[temp]==false&&temp>=0) temp--; for(int j=++temp; j<=cur; j++) num=num*10+str[j]-'0'; sum+=num; dfs(cur+1,end,sum); save[cur]=false; sum-=num; dfs(cur+1,end,sum); } void dfs2(int cur,int end,int sum) { if(cur==end) { int temp=cur; while(save[temp]==false&&temp>i) temp--; int num=0; for(int j=++temp; j<=cur; j++) num=num*10+str[j]-'0'; sum+=num; for(int j=0; j<(int)st.size(); j++) { if(sum==st[j]) ans++; } return ; } save[cur]=true; int num=0; int temp=cur-1; while(save[temp]==false&&temp>i) temp--; for(int j=++temp; j<=cur; j++) num=num*10+str[j]-'0'; sum+=num; dfs2(cur+1,end,sum); save[cur]=false; sum-=num; dfs2(cur+1,end,sum); } int main() { //freopen("in.txt","r",stdin); while(cin>>str&&strcmp(str,"END")!=0) { int len=strlen(str); ans=0; for(i=0; str[i+1]!='\0'; i++) { st.clear(); memset(save,false,sizeof(save)); dfs(0,i,0); dfs2(i+1,len-1,0); } cout<<ans<<endl; } return 0; }
相关文章推荐
- HDU 4282 - A very hard mathematic problem(数学)
- HDU ~ 4430 ~ Yukari's Birthday(二分or数学)
- hdu 4430 Yukari's Birthday (简单数学 + 二分)
- HDU 4403 A very hard Aoshu problem (暴力+状态压缩)
- HDU 4909 String(组合数学)
- HDU 2289 Cup 数学+二分
- HDU 4611 Balls Rearrangement 数学 循环节优化
- hdu - 2058 The sum problem (数学题)
- HDU 4569 Special equations(数学推论)
- hdu-1593 find a way to escape(贪心,数学)
- HDU 4488 Faulhaber’s Triangle (数学题)
- 【数学 递推】 HDU 1143 Tri Tiling
- HDU 5710 Digit-Sum 数学杂题
- HDU 1568 Fibonacci【数学】
- HDU 4675GCD of Sequence(大组合数取模 容斥原理 组合数学)
- hdu 5065 数学题
- hdu-5651 xiaoxin juju needs help(数学+gcd约分求阶乘)
- HDU 3398 String 组合数学+N!质因数分解 卡特兰数
- HDU-4572 Bottles Arrangement (数学)
- hdu 2964 Prime Bases (数学:算不上太水)