sincerit 符號三角形(深搜)
阿新 • • 發佈:2018-12-23
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;
}