HDOJ-ACM1023(JAVA)

题意:输入栈的大小,输出可能的出栈顺序的个数。
这道题,如果做了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)的更多相关文章
- hdoj 1753 (Java)
刚刚开始用Java,代码难免不够简洁. import java.math.BigDecimal; import java.util.Scanner; public class Main { publi ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)
Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现 ...
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
Problem Description As the increase of population, the living space for people is becoming smaller a ...
- HDOJ(HDU) 2133 What day is it(认识下Java的Calendar类---日期类)
Problem Description Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me wha ...
- hdoj 1753 大明A+B 高精度/java
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdoj 1002 A + B Problem II 高精度 java
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDOJ 2317. Nasty Hacks 模拟水题
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- HDOJ 1326. Box of Bricks 纯水题
Box of Bricks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
随机推荐
- python使用psutil获取服务器信息
>>> import psutil 获取cpu信息>>> psutil.cpu_times()scputimes(user=128258.38, nice=12.2 ...
- Educational Codeforces Round 8 D. Magic Numbers
Magic Numbers 题意:给定长度不超过2000的a,b;问有多少个x(a<=x<=b)使得x的偶数位为d,奇数位不为d;且要是m的倍数,结果mod 1e9+7; 直接数位DP;前 ...
- 关于return和exit
关于return和exit 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,exit改成return 会出现父子进程又各自重复开始进行. 1. ...
- python 下载安装及setuptools应用
1.首先下载python安装程序,下载地址:https://www.python.org/download/releases/2.7.8/ 如下图: 因为我的机器是32位的就选择了Windows x8 ...
- centos 下 yum 安装 nginx 平滑切换安装到 Tengine
---恢复内容开始--- 据说淘宝的Tengine很牛X,所以我们今天也来玩玩,我们这里是某开放云的vps,现在已经安装好了nginx,现在我们要平滑切换到安装Tengine. 下载Tengine,解 ...
- tomcat+apache 实现负载均衡之一:同一台电脑部署2个以上tomcat
1. 下载tomcat 8.0.17 http://apache.fayea.com/tomcat/tomcat-8/v8.0.17/bin/apache-tomcat-8.0.17.tar.gz ...
- 练习C之SELECT形式的非阻塞IO
呵呵,理解得不深,但毕竟手打全版,且无错.但select.h不知何处找头文件, 粘下来作个记录. POLL,EPOLL感觉代码类似,只是函数和系统实现不一样,,EPOLL目前最合理的.定位精确,算法复 ...
- HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值
在html中:name指的是用户名称,ID指的是用户注册是系统自动分配给用户的一个序列号. name是用来提交数据的,提供给表单用,可以重复: id则针对文档操作时候用,不能重复.如:document ...
- Linux下使用clock_gettime给程序计时
http://www.cnblogs.com/daqiwancheng/archive/2010/07/01/1769522.html
- misc_register、 register_chrdev 的区别总结
参考: http://longer.spaces.eepw.com.cn/articles/article/item/60415 http://imganquan.org/blog/?p=350 网上 ...