openjudge 符號三角形
阿新 • • 發佈:2019-01-29
2990:符號三角形
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65536kB
- 描述
- 符號三角形的第1行有n個由“+”和”-“組成的符號 ,以後每行符號比上行少1個,2個同號下面是”+“,2個異號下面是”-“ 。計算有多少個不同的符號三角形,使其所含”+“ 和”-“ 的個數相同。
n=7時的1個符號三角形如下:+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+ - 輸入
- 每行1個正整數n<=24,n=0退出.
- 輸出
- n和符號三角形的個數.
- 樣例輸入
-
15 16 19 20 0
- 樣例輸出
-
15 1896 16 5160 19 32757 20 59984
-
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,num[30],sum[30],ans[30][30],f[30]; int m,maxn,i; void dfs(int dep,int x,int y) { if (dep==maxn+1) { return; } if (x==y) f[dep]++; for (int i=0;i<=1;i++) { ans[dep+1][1]=i; int xx=0,yy=0; for (int j=2;j<=dep+1;j++) { if (ans[dep][j-1]==1) ans[dep+1][j]=ans[dep+1][j-1]; else if (ans[dep+1][j-1]==1) ans[dep+1][j]=0; else ans[dep+1][j]=1; if (ans[dep+1][j]==0) xx++; else yy++; } if (i==0) dfs(dep+1,x+xx+1,y+yy); else dfs(dep+1,x+xx,y+yy+1); } } int main() { scanf("%d",&n); while (n!=0) { m++; num[m]=n; maxn=max(maxn,n); scanf("%d",&n); } for (i=1;i<=maxn;i++) sum[i]=sum[i-1]+i; dfs(0,0,0); for (i=1;i<=m;i++) printf("%d %d\n",num[i],f[num[i]]); return 0; }
-
//這道題剛開始的思路是讀入一個N,然後只搜尋第一行的狀態,然後根據的一行推下面的每一行,結果超時了。經大神指點,其實可以先進行離散處理找出最大值,根據前一行的狀態不斷往後推,每次只需列舉每一行的第一個,然後再搜尋的過程中記錄每一行的值。