hdu 2510 符号三角形 (DFS+打表)

符号三角形

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


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
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  2512 2515 2509 2517 2514 
 

这题还比较好吧,开始写了代码发现一定会超时,后来看了别人的解法再想想,可以打表解决,小菜的dfs一般,解24时要好几分钟...

还有题目加减号的情况和异或一样,于是用01表示方便计算。

#include<stdio.h>
#include<string.h>
int n,cnt,m;
int c[50];
int judge(int c0[])
{
    int cc=0;
    int s[50];
    for(int i=0;i<n;i++){ 
        s[i]=c0[i];
        if(c0[i]) cc++;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++) s[j]=c0[j];                            
        for(int j=0;j<n-i-1;j++)
            if(c0[j]=s[j]^s[j+1]) cc++;
    }
    if(cc==m) return 1;
    return 0;
}
void dfs(int id)
{
    if(id==n){
        cnt+=judge(c);return;
    }
    c[id]=0; 
    dfs(id+1);
    c[id]=1;
    dfs(id+1);
    return; 
}
int main(void)
{
    //freopen("C:\Users\Administrator\Desktop\in.txt","r",stdin);
    //freopen("C:\Users\Administrator\Desktop\out.txt","w",stdout);
    while(scanf("%d",&n)!=EOF)
    {
        memset(c,0,sizeof(c));
        m=(n+1)*n/2;
        if(m%2){ //小剪枝
            printf("%d %d
",n,0);
            continue;
        }
        m/=2;
        cnt=0;
        dfs(0);
        printf("%d %d
",n,cnt);
    }
    return 0; 
}
/*


*/

求得解后打表

 1 #include<stdio.h>
 2 int ans[25]={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};
 3 int main(void)
 4 {
 5     int n;
 6     while(scanf("%d",&n),n)
 7     {
 8         printf("%d %d
",n,ans[n]);
 9     }
10     return 0;    
11 }

  

原文地址:https://www.cnblogs.com/GO-NO-1/p/3606032.html