【ZCMU1795】wjw的hard problem(dfs)
阿新 • • 發佈:2018-12-14
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結尾
Output
對每組資料輸出,每組一行,包含一個整數,表示答案
Sample Input
1212
1235
0
Sample Output
2
0
HINT
Source
【解題思路】
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; }