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 ...
随机推荐
- LCD显示方向
一.ILI9341内存到显示地址的映射 本文只讨论“正常显示”,不讨论“垂直滚动显示”模式. 可以看到物理内存被两个指针访问,行指针和列指针,行指针范围从000h到013Fh,列指针范围为0000h到 ...
- 查看 usb info
mount -t usbfs /proc/bus/usb /proc/bus/usb cat /proc/bus/usb/devices
- 网络请求 post 的接受请求头的代理方法
接收响应头 content-Length content-Type - (void)connection:(NSURLConnection *)connection didReceiveRespons ...
- JavaScript trim 实现(去除字符串首尾指定字符)
String.prototype.trim = function (char, type) { if (char) { if (type == 'left') { return this.replac ...
- <七> jQuery 设置内容和属性
设置内容 text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 设置属性 jQuery attr( ...
- How to Cracked Sublime Text 3 Build 3065 in Ubuntu (Linux)
整理自How to Cracked Sublime Text 3 Build 3065 in Ubuntu (Linux) Sublime Text 3 Build 3065 Release Date ...
- php和.net的DES加密解密方法
.net版本 /// <summary> /// DES加密 /// </summary> /// <param name="pToEncrypt"& ...
- POJ2200+全排列模拟
简单. 手动的实现全排列 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<a ...
- [wikioi]线段覆盖
http://wikioi.com/problem/1214/ 这道题也归为贪心了.我也不是很能分辨,但想法确实是:1.有阶段最优化性:2.前一状态和后一状态有关系. 想法:1.排个序是很自然的想法, ...
- ANDROID_MARS学习笔记_S01原始版_002_实现计算乘积及menu应用
一.代码 1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...