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