码迷,mamicode.com
首页 > 编程语言 > 详细

HDOJ-ACM1023(JAVA)

时间:2016-07-08 16:35:51      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

题意:输入栈的大小,输出可能的出栈顺序的个数。

 

这道题,如果做了1022,那就只要在上面改改就行了,

第一想法是加上全排列-----结果是正确的,但是绝对会超时

验证性的实现了:(Time Limit Exceeded

import java.util.*;

import java.io.*;

public class Main{

    public static void main(String[] arg){
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        while(scan.hasNextInt()){
            int n =scan.nextInt();
            count = 0;
            char[] cs = new char[n];
            char[] copy = new char[n];
            for(int i = 0 ; i != cs.length ; i ++ ){
                cs[i] = (char) i;
                copy[i] = (char) i;
            }
            getAllPermutationsAndCheck(copy,cs,0,n);
            System.out.println(count);
        }
        scan.close();
    }
    
    static int[] outFlag = new int[200];//最多有200辆火车,1表示出,0表示进
    static char[] stack = new char[100];
    static int count;
    
    static void check(char[] put , char[] pop){
        int n = put.length;
        int top = -1;
        int in=0,out=0,flag=0;
        while(out!=n&&in!=n+1){
            if(top!=-1&&stack[top] == pop[out]){
                top--;
                out++;
                outFlag[flag++] = 1;
                continue;
            }
            if(in==n){
                break;
            }
            top++;
            stack[top] = put[in++];
            outFlag[flag++] = 0;
        }
        if(flag==2*n){
            count++;
        }
    }
    
    //非字典序
    static void getAllPermutationsAndCheck(char[] copy,char[] cs,int start,int len){
            if(start == len ){
                check(copy, cs);
                return;
            }
            for(int i = start ; i != len ; i ++){
                swap(cs,i,start);
                getAllPermutationsAndCheck(copy,cs,start+1,len);
                swap(cs,i,start);
            }
        }
        
        static void swap(char[] cs , int i , int j){
            char t;
            t = cs[i];
            cs[i] = cs[j];
            cs[j] = t;
        }

}

 

做了2021,题中有个(n<1000000),和这道题一样(The result will be very large, so you may not process it by 32-bit integers.),可以想象得到,不能用递归,应该有巧妙方法来求。

不过,绞尽脑汁地想也想不出来的,除非你能从结果中看出规律~反正我没看出来 - -  

结果符合卡特兰数,1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786,......

 卡特兰数实现:① h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)    (n>=2)

        ② h(n)=h(n-1)*(4*n-2)/(n+1)

        ③ h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

        ④ h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

我实现了第二个:(Wrong Answer

import java.util.*;

import java.io.*;

public class Main{

    public static void main(String[] arg){
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        while(scan.hasNextInt()){
            int n =scan.nextInt();
            int count = catalan(n);
            System.out.println(count);
        }
        scan.close();
    }

    static int catalan(int n) {
        if(n==1){
            return 1;
        }
        return catalan(n-1)*(4*n-2)/(n+1);
    }

}

 

当然,数字越界了(The result will be very large, so you may not process it by 32-bit integers.)

因此,要用大数处理 - -

我用JAVA里面的BigInteger立刻就Accepted

import java.util.*;

import java.io.*;
import java.math.BigInteger;

public class Main{

    public static void main(String[] arg){
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        while(scan.hasNextInt()){
            int n =scan.nextInt();
            BigInteger count = catalan(n);
            System.out.println(count.toString());
        }
        scan.close();
    }

    static BigInteger catalan(int n) {
        if(n==1){
            return new BigInteger("1");
        }
        return catalan(n-1).multiply(new BigInteger(String.valueOf(4*n-2))).divide(new BigInteger(String.valueOf(n+1)));
    }
    
}

 

HDOJ-ACM1023(JAVA)

标签:

原文地址:http://www.cnblogs.com/xiezie/p/5586899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!