符号三角形问题

输入:n (1<n<=27).

输出不同方案的个数.

注意:纯打表必和谐掉,不信就试试;有限打表,你懂的。

 测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 2↵
  2. 3↵
以文本方式显示
  1. 0↵
  2. 4↵
1秒64M0
#include<iostream> 
#include<cstring> 
#include<algorithm> 
using namespace std; 
int te[30][30]; //三角形 
int record[30]; 
int n,sd,sum,ct; //第一行符号个数,总量半数,方案总数,+个数  
 
inline void backtrack(int t) 
{ 
    if((ct>sd)||(t*(t-1)/2-ct>sd)) 
    return; 
    else if(t>n) sum++; 
    else 
    { 
        for(int i=0;i<=1;i++) //子集树 
        {        
            te[1][t]=i; 
            ct += i; 
            register int ls=0;
            for(int j=2;j<=t;j++) 
            { 
                te[j][t-j+1]=te[j-1][t-j+2]^te[j-1][t-j+1]; 
                ls += te[j][t-j+1]; 
            }  
            ct += ls;
            backtrack(t+1); 
            ct -= ls; //去掉外侧列,回溯一层 
            ct -= i;  
       }  
    }  
} 
 
int main(){ 
	record[27]=5804913;
	record[24]=822229;
	record[23]=431095;
	//有限打表 
	while(scanf("%d",&n)!=EOF) 
	{ 
		if(!record[n]) 
		{ 
			sd=n*(n+1)/2; 
			sum=0; 
			ct=0; 
			if(sd%2==1); //必没有答案  
			else 
			{ 
				sd/=2; 
				backtrack(1); 
			} 
			record[n]=sum; 
		} 
		else 
		{ 
			sum=record[n]; 
		}  
		cout<<sum<<endl;         
	} 
}  

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值