1. 程式人生 > >openjudge 符號三角形

openjudge 符號三角形

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,然後只搜尋第一行的狀態,然後根據的一行推下面的每一行,結果超時了。經大神指點,其實可以先進行離散處理找出最大值,根據前一行的狀態不斷往後推,每次只需列舉每一行的第一個,然後再搜尋的過程中記錄每一行的值。