现在的位置: 首页 > 综合 > 正文

HDU 2510 符号三角形 【DFS】

2018年01月20日 ⁄ 综合 ⁄ 共 1122字 ⁄ 字号 评论关闭

符号三角形

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

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打表,发现规律。
+ + - + - + + 
+ - - - - + 
- + + + - 
- + + - 
- + - 
- - 
+
DFS时每次增加一行仅需改变头字符的类型,且满足 
map[step][j]=map[step][j-1]^map[step-1][j-1]; 
*/ 

打表代码: 
#include<cstdio>
#include<cstring>
int map[30][30],res[30];
void dfs(int step,int s)
{
    int ans;
    for(int i=0; i<2; i++)
    {
        map[step][0]=i;
        ans=i;
        for(int j=1; j<step; j++)
        {
            map[step][j]=map[step][j-1]^map[step-1][j-1];
            ans+=map[step][j];
        }
        if((1+step)*step/2==(ans+s)*2) res[step]++;
        if(step==24) continue;
        dfs(step+1,s+ans);
    }
}
        
int main()
{
    memset(res,0,sizeof(res));
    memset(map,0,sizeof(map));
    dfs(1,0);
    for(int i=1; i<=24; i++)
    {
        printf("%d, ",res[i]);
    }
    while(1);
}

#include<cstdio>
int main(){
    int n,table[]={0,0, 0, 4, 6, 0, 0, 12, 40, 0, 0, 171, 410, 0, 0, 1896, 5160, 0, 0, 32757, 59984,
0, 0, 431095, 822229};
    while(scanf("%d",&n)&&n){
        printf("%d %d\n",n,table[n]);
    }
    return 0;
}

抱歉!评论已关闭.