POJ 2084 递归+卡特兰数+JAVA大整数运算实例

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]);
}

}

}

转载于:https://www.cnblogs.com/liushang0419/archive/2011/05/19/2051203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值