sincerit 符号三角形(深搜)

本文探讨了一种特定的符号三角形构造问题,通过递归算法计算满足特定条件的符号三角形数量。输入为一行正整数n,输出n与符合要求的符号三角形个数。文中提供了两种算法实现:一种基于深度优先搜索(DFS),另一种为预计算表格方法,后者在处理大规模数据时表现出更高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

符号三角形

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值