HDU 4403 A very hard Aoshu problem DFS
生活随笔
收集整理的這篇文章主要介紹了
HDU 4403 A very hard Aoshu problem DFS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem statement
這道題給我們一個不超過15位的整數 讓我們在其中加等號或者加號
如果加完符號后符合計算結果 那么計數 最后輸出所有的情況
problem analysis
這道題其實就是想辦法遍歷所有情況
把合法的記錄下來 最終輸出就得到解
如何枚舉呢
我們可以枚舉等號的位置 等號左邊dfs一下 等號右邊dfs一下
最后最后看兩遍結果是否一樣 一樣就記錄++
最后左右兩遍可以搞兩個dfs
如何dfs 就是枚舉加號的位置把每一種情況都遍歷到就好了
problem code
#include<bits/stdc++.h> using namespace std; char a[20]; int num[20][20],len,ans; void rdfs(int lsum,int pos,int rsum){if(pos == len){// 如果走完了所有的數 那么判斷左是否等于右 如果等于 就記錄結果if(lsum==rsum)ans++;return;}for(int i=pos;i<len;i++){rdfs(lsum,i+1,rsum+num[pos][i]); //這就相同與ldfs} } void ldfs(int k,int mid,int lsum){//k表示當前位置 mid表示等號位置 lsum記錄左邊的和 if(k==mid){// 如果當前位置到mid 我們就搜索右邊的和 rdfs(lsum,mid,0);}for(int i=k;i<mid;i++){ldfs(i+1,mid,lsum+num[k][i]);// 這里就會把所有的加號情況遍歷 對每一個位置 下一個加號在k到mid的任何位置都會嘗試一遍 也就是對于當前位置 下一個加號的位置都搜索一遍 可以枚舉到所有的加號情況 }//左半部分枚舉加號 } int main() {while(scanf("%s",a)){len = strlen(a);if(strcmp(a,"END")==0)break;for(int i=0;i<len;i++){for(int j=0;j<len;j++){int sum=0;for(int k=i;k<=j;k++)sum = sum*10+(a[k]-'0');//預處理把任意i到j的數的大小求出來num[i][j] = sum;}}for(int i=1;i<len;i++)ldfs(0,i,0);printf("%d\n",ans);ans=0;}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的HDU 4403 A very hard Aoshu problem DFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android原生人脸识别Camera2
- 下一篇: 测试人员报BUG的正确姿势