hdu 2510 符号三角形

本文介绍了一种通过深搜+回溯的方法解决HDU编程问题的策略,特别强调了在处理'+'和'-'符号时使用异或运算的技巧。文章提供了两种解决方案:一种是深度优先搜索(DFS)实现的代码,另一种是预先计算结果的打表方法。适合计算机科学领域的学习者和开发者阅读。

 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2510

 

我是通过深搜+回溯然后打表通过的。。。

就是对于‘+’和‘-’的处理上有点难想,这里用到了异或运算。

我们知道1^1=0; 1^0=1, 0^1=1 , 0^0=0;

把-‘-’当作1,‘+’当作0时;这样正好满足题意。 

方便计算

 

 

 

下面分是用DFS的AC代码和打表代码:

@@@DFS:

#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、付费专栏及课程。

余额充值