POJ 2084

http://poj.org/problem?id=2084

通过对题目的分析,总结出递归式:

h(0)=1,h(1)=1 递归式:  

h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2),这是n阶递推关系;

然后第一次,用递归形式加记忆搜索写代码,不知怎么回事,时间特别慢,纳闷,之后又改为dp[]实际上,两者道理一摸一样,只是写法不同,可是写完后,发现此题得用高精度,吐血!!!然后想趁此题,把java的大整数运算的用法学会,否则,高精度虽然有模板,但是每次都得打一大堆代码,看的头都大了,,,

《递归格式的代码》

#include<iostream>
using namespace std;
long long dp[100];

long long funDP(int cur){
if(cur==0||cur==1)
return 1;
if(dp[cur]>0)
return dp[cur];//记忆化搜索
long long sum = 0;
for(int i=0;i<cur;i++)
sum
+=funDP(i)*funDP(cur-i-1);

dp[cur]
=sum;
return dp[cur];
}


int main(){
int n;
memset(dp,
0,sizeof(dp));
while(cin>>n&&n!=-1){
cout
<<funDP(n)<<endl;
}
return 0;
}

《DP格式的代码》

#include<iostream>
using namespace std;
long long dp[100];

int main(){
int n;
memset(dp,
0,sizeof(dp));

dp[
0]=dp[1]=1;
for(int i=2;i<=100;i++){
for(int j=0;j<i;j++)
dp[i]
+=(dp[j]*dp[i-j-1]);
}

while(cin>>n&&n!=-1){
cout
<<dp[n]<<endl;
}
return 0;
}

加入大整数运算:JAVA代码介绍

  1. /*后来查阅牛人代码,发现原来这个递归式是著名的卡特兰数,递归式可以化简为一阶递归式
  2.  * 令h(0)=1,h(1)=1,catalan数满足递归式:  
  3.  * h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2),这是n阶递推关系;  
  4.  * 还可以化简为1阶递推关系: 如h(n)=(4n-2)/(n+1)*h(n-1)(n>1) h(0)=1  
  5.  * 该递推关系的解为:h(n)=c(2n,n)/(n+1) (n=1,2,3,...)//2n!/n!/n!  
  6.  * 卡 塔兰数例的前几项为(sequence A000108 in OEIS) [注: n = 0, 1, 2, 3, … n]  
  7.  * 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440,  
  8.  * 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020,  
  9.  * 91482563640, 343059613650, 1289904147324, 4861946401452, …  
  10.  * poj2084  
  11.  * @author NC  
  12.  */  

在ACM中使用JAVA的介绍:

http://www.cnitblog.com/weiweibbs/archive/2008/04/28/43053.html

然后写了一个java 格式的,可是总是提交上去总是complier Error 这是怎么个情况啊???????????????

<原来...类名必须为Main... ...POJ1000题中有写....>

import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class poj {

public static void main(String[] args) {

Scanner sc
= new Scanner(new BufferedInputStream(System.in));

//建立大整数数组并且初始化
BigInteger [] dp = new BigInteger[101];
for(int i=0;i<101;i++)
dp[i]
= BigInteger.valueOf(0);
//初始化dp表
dp[0] = BigInteger.valueOf(1);
dp[
1] = BigInteger.valueOf(1);
//构建dp[]列表
for(int i=2;i<=100;i++)
for(int j=0;j<i;j++)
dp[i]
=dp[i].add(dp[j].multiply(dp[i-j-1]));
while(true){
int n = sc.nextInt();
if(n==-1)break;

System.out.println(dp[n]);
}

}

}
posted on 2011-05-19 16:16  geeker  阅读(635)  评论(0编辑  收藏  举报