• 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 }

      

  • 相关阅读:
    链表
    求最大子串
    【JavaScript】7-23 币值转换 (20分)
    【JavaScript】7-22 龟兔赛跑 (20分)
    【JavaScript】7-21 求特殊方程的正整数解 (15分)
    【JavaScript】7-20 打印九九口诀表 (15分)
    【JavaScript】7-19 支票面额 (15分)
    【JavaScript】7-18 二分法求多项式单根 (20分)
    【JavaScript】7-17 爬动的蠕虫 (15分)
    【JavaScript】7-16 求符合给定条件的整数集 (15分)
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3606032.html
Copyright © 2020-2023  润新知