dfs
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
?題目:http://acm.hdu.edu.cn/showproblem.php?pid=2510
?
我是通過深搜+回溯然后打表通過的。。。
就是對于‘+’和‘-’的處理上有點難想,這里用到了異或運算。
我們知道1^1=0; 1^0=1, 0^1=1 , 0^0=0;
把-‘-’當(dāng)作1,‘+’當(dāng)作0時;這樣正好滿足題意。?
方便計算
?
?
?
下面分是用DFS的AC代碼和打表代碼:
@@@DFS:
[cpp]?view plaincopy print?- #include<iostream>????
- using?namespace?std;????
- int?n;????????????????????
- int?counter;????????????//1計數(shù),即“-”號計數(shù)???????????
- int?p[30][30];????????
- ???
- int?cnt[30];??
- ???
- void?DFS(int?n)??????
- {????
- ????int?i,?j;????????????
- ????if(?n?>?24?)????
- ????{????
- ????????return?;?????????????????
- ????}????
- ????else???
- ????{????
- ???????for(i=0;?i<2;?++i)????
- ???????{????
- ????????????p[1][n]?=?i;????????//第一行第n個符號????
- ????????????counter?+=?i;???????//“-”號統(tǒng)計,因為"+"的值是0???
- ????????????????
- ????????????for(j=2;?j<=n;?++j)??//當(dāng)?shù)谝恍蟹?gt;=2時,可以運算出下面行的某些符號,j可代表行號????
- ????????????{?????
- ???????????????p[j][n-j+1]?=?p[j-1][n-j+1]^p[j-1][n-j+2];//通過異或運算下行符號,t-j+1確定的很巧????
- ???????????????counter?+=?p[j][n-j+1];?????????????????????????
- ????????????}?????
- ??????????????
- ????????????if(n*(n+1)/2==2*counter)??
- ????????????{??
- ????????????????cnt[n]++;??
- ????????????}??
- ??????????????
- ????????????DFS(n+1);??????????
- ??????????????
- ??????????????
- ????????????for(j=2;?j<=n;?++j)????//回溯,判斷另一種符號情況???像是出棧一樣,恢復(fù)所有對counter的操作??
- ????????????{????
- ????????????????counter?-=?p[j][n-j+1];????
- ????????????}?????????????????????
- ????????????counter?-=?i;????
- ???????}????
- ????}????
- }????
- ???
- int?main()????
- {???
- ????counter?=?0;??
- ??
- ????DFS(1);??
- ????while(cin?>>?n,n)??
- ????{??
- ????????cout<<cnt[n]<<endl;??
- ????}???
- ????return?0;????
- }??
- ?????
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@打表代碼:
[cpp]?view plaincopy print?- #include?<iostream>???
- using?namespace?std;?????
- int?result[24]={0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229};???
- int?main()???
- {???
- ????int?n;???
- ????cin>>n;??
- ????while(n!=0)??
- ????{??
- ????????cout<<n<<"?"<<result[n-1]<<endl;??
- ????????cin>>n;??
- ????}??
- ????return?0;??
- } ?
總結(jié)
- 上一篇: 快速求欧拉函数
- 下一篇: 远看青山绿水下一句是什么呢?