1. 程式人生 > >sincerit 符號三角形(深搜)

sincerit 符號三角形(深搜)

符號三角形

Problem Description
符號三角形的 第1行有n個由“+”和”-“組成的符號 ,以後每行符號比上行少1個,2個同號下面是”+“,2個異 號下面是”-“ 。計算有多少個不同的符號三角形,使其所含”+“ 和”-“ 的個數相同 。 n=7時的1個符號三角形如下:

Input
每行1個正整數n <=24,n=0退出.
Output
n和符號三角形的個數.
Sample Input
15
16
19
20
0
Sample Output
15 1896
16 5160
19 32757
20 59984

一般的搜尋T了
前面輸出答案效率還是比較快的到n=19的時候就明顯慢了,這裡是要去剪枝的但是我不會啊, 雖然靠打表過了

// 超時程式碼
#include <stdio.h>
#include <cstring>
// 搜尋  只要列舉完第n層的,以下n-1層的符號就確定了
int sign[30][30];
int add, sub, sum, n;
void DFS(int c) {
  if (c == n+1) {
    add = 0;sub = 0;
    for (int i = n; i >= 2; i--){
      for (int j = 1; j <= i-1; j++) {
        if (sign[i][j] == sign[i][j+1]) {
          sign[i-1][j] = 1;
          ++add;
        } else {
          sign[i-1][j] = 0;
          ++sub;
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      if (sign[n][i] == 1) ++add;
      else ++sub;
    }
    if (add == sub) ++sum;
    return;
  }
  
  for (int i = 0; i <= 1; i++) {
    sign[n][c] = i;
    DFS(c+1);
    sign[n][c] = 0;
  }
} 
int main() {
  while (scanf("%d", &n), n) {
    sum = 0;
    DFS(1);
    printf("%d %d\n", n, sum);
  }
}

打表程式碼

#include <stdio.h>
#include <cstring>
int table[28] = {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 main() {
  int n;
  while (scanf("%d", &n), n) printf("%d %d\n", n, table[n]);
  return 0;
}