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

你可能感兴趣的:(openjudge 符号三角形)