符号三角形

符号三角形

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1948    Accepted Submission(s): 1002


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

超时**__**
/*
分类:dfs 
来源:hdu符号三角形
思路:就是对于‘+’和‘-’的处理上有点难想,这里用到了异或运算。
我们知道1^1=0; 1^0=1, 0^1=1 , 0^0=0;
把-‘-’当作1,‘+’当作0时;这样正好满足题意。 
方便计算
We are giants.
create by Lee_SD on 2017/4/
*/
#include<iostream>  
using namespace std;  
int n;                  
int counter;            //1计数,即“-”号计数         
int p[30][30];      
 
int cnt[30];
 
void DFS(int n)    
{  
    int i, j;          
    if( n > 24 )  
    {  
        return ;               
    }  
    else 
    {  
       for(i=0; i<2; ++i)  
       {  
            p[1][n] = i;        //第一行第n个符号  
            counter += i;       //“-”号统计,因为"+"的值是0 
              
            for(j=2; j<=n; ++j)  //当第一行符号>=2时,可以运算出下面行的某些符号,j可代表行号  
            {   
               p[j][n-j+1] = p[j-1][n-j+1]^p[j-1][n-j+2];//通过异或运算下行符号,t-j+1确定的很巧  
               counter += p[j][n-j+1];                       
            }   
			
			if(n*(n+1)/2==2*counter)
			{
				cnt[n]++;
			}
            
            DFS(n+1);        
            
			
            for(j=2; j<=n; ++j)    //回溯,判断另一种符号情况   像是出栈一样,恢复所有对counter的操作
            {  
                counter -= p[j][n-j+1];  
            }                   
            counter -= i;  
       }  
    }  
}  
 
int main()  
{ 
	counter = 0;

	DFS(1);
    while(cin >> n,n)
	{
		cout<<cnt[n]<<endl;
	} 
    return 0;  
}
   
打表
#include <iostream> 
using namespace std;   
int result[24]={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; 
	cin>>n;
	while(n!=0)
	{
		cout<<n<<" "<<result[n-1]<<endl;
		cin>>n;
	}
	return 0;
}



 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值