描述
-
符号三角形的第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,然后只搜索第一行的状态,然后根据的一行推下面的每一行,结果超时了。经大神指点,其实可以先进行离散处理找出最大值,根据前一行的状态不断往后推,每次只需枚举每一行的第一个,然后再搜索的过程中记录每一行的值。