HDU 2510 符號三角形
阿新 • • 發佈:2018-12-15
這是一個深搜水題,但是很扎心,寫完程式碼然後打表,連續打錯了兩次,我日了。
就是深搜第一行,每個元素有兩種選擇'+' 或者'-'(程式碼裡我改成了1和2)然後帶了N層 返回就行了 。
it‘s real like dream My heart will go on
表
#include <iostream> #include <cstdio> using namespace std; int main(){ int a[25]={0,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 n; while(~scanf("%d",&n)){ if(n==0) break; cout<<n<<" "<<a[n]<<endl; } return 0; }
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int mp[25]; int book[25]; int n,ans; int judge(){ int mp2[26][26]; int num1=0; int num2=0; for(int i=0;i<n;i++) { mp2[0][i]=mp[i]; } for(int i=1;i<n;i++){ for(int j=0;j<n-i;j++){ if(mp2[i-1][j]==mp2[i-1][j+1]) mp2[i][j]=1; else mp2[i][j]=2; } } for(int i=0;i<n;i++){ for(int j=0;j<n-i;j++){ if(mp2[i][j]==1) num1++; else num2++; } } if(num1==num2) ans++; } void dfs(int step){ if(step==n){ if(judge()==1) ans++; return ; } for(int i=1;i<=2;i++){ if(book[step]==0){ book[step]=1; mp[step]=i; dfs(step+1); book[step]=0; } } } int main(){ while(~scanf("%d",&n)){ memset(mp,0,sizeof(mp)); memset(book,0,sizeof(book)); ans=0; dfs(0); cout<<ans<<endl; } return 0; }