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