"100 个台阶"问题的 4 种解法
2007-07-18 08:59
429 查看
[align=left]/*[/align]
[align=left]问题描述:[/align]
[align=left] [/align]
[align=left]100 个台阶, 每次可以走 1 或 2 或 3 个台阶, 走完这 100 个台阶共有多少种走法?[/align]
[align=left] [/align]
[align=left]基本思想:[/align]
[align=left]f(1) = 1;[/align]
[align=left]f(2) = 2;[/align]
[align=left]f(3) = 4;[/align]
[align=left]f(n) = f( n-1 ) 最后一步为 1[/align]
[align=left] + f( n-2 ) 最后一步为 2[/align]
[align=left] + f( n-3 ) 最后一步为 3[/align]
[align=left]*/[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]double recursion1( int n )[/align]
[align=left]{[/align]
[align=left] if( n == 1 )[/align]
[align=left] return 1;[/align]
[align=left] else if( n == 2 )[/align]
[align=left] return 2;[/align]
[align=left] else if( n == 3 )[/align]
[align=left] return 4;[/align]
[align=left] else [/align]
[align=left] {[/align]
[align=left] printf("%5d", n );[/align]
[align=left] return recursion1( n-1 ) + recursion1( n-2 ) + recursion1( n-3 );[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]double recursion2( int n )[/align]
[align=left]{[/align]
[align=left] /* [/align]
[align=left] 算法思想:[/align]
[align=left] 将已经算出的 数保存在 cash[] 中, 每次先在 cash[] 中查找, 如果找到则不再递归, 直接返回结果.[/align]
[align=left] */[/align]
[align=left] static double cash[100] = {0,1,2,4}; [/align]
if( cash
!= 0 )
return cash
;
[align=left] else[/align]
[align=left] {[/align]
[align=left] printf("%5d", n );[/align]
cash
= recursion2( n - 3 ) + recursion2( n-2 ) + recursion2( n-1 );
return cash
;
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double no_recursion1( int n )[/align]
[align=left]{[/align]
[align=left] if( n == 1 )[/align]
[align=left] return 1;[/align]
[align=left] else if( n == 2 )[/align]
[align=left] return 2;[/align]
[align=left] else if( n == 3 )[/align]
[align=left] return 4;[/align]
[align=left] [/align]
[align=left] double t_3 = 1; // record f( n-3 )[/align]
[align=left] double t_2 = 2; // record f( n-2 )[/align]
[align=left] double t_1 = 4; // record f( n-1 )[/align]
[align=left] double sum = 0;[/align]
[align=left] for( int i = 4; i <= n; i ++ )[/align]
[align=left] {[/align]
[align=left] // f(n) = f( n-1 ) + f( n-2 ) + f( n-3 )[/align]
[align=left] sum = t_1 + t_2 + t_3;[/align]
[align=left] [/align]
[align=left] // update f( n-1 ), f( n-2 ), f( n-3 )[/align]
[align=left] t_3 = t_2;[/align]
[align=left] t_2 = t_1;[/align]
[align=left] t_1 = sum;[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double ff( int end, int beg = 1 )[/align]
[align=left]{[/align]
[align=left] if( end == 0 || end == 1)[/align]
[align=left] return 1;[/align]
[align=left] [/align]
[align=left] double ss = 1;[/align]
[align=left] for( int i = beg; i <= end ; i ++ )[/align]
[align=left] ss *= i;[/align]
[align=left] return ss;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double no_recursion2( int nn )[/align]
[align=left]{[/align]
[align=left] /* [/align]
[align=left] 算法思想:[/align]
[align=left] 找出满足 x + 2y + 3z == nn 的所有 x, y, z, 之后问题变成一个重集 B 上的全排列问题:[/align]
[align=left] 其中 B = { x.1, y.2, z.3 }, [/align]
[align=left] 公式为: nn!/( x! * y! * z! )[/align]
[align=left] (此处对阶乘算法没有进一步优化)[/align]
[align=left] */[/align]
[align=left] double sum = 0;[/align]
[align=left] for( int z = 0; z < 34; z ++ )[/align]
[align=left] {[/align]
[align=left] for( int y = 0; y < 51; y ++ )[/align]
[align=left] {[/align]
[align=left] for( int x = 0; x < 101; x ++ )[/align]
[align=left] {[/align]
[align=left] if( x + 2*y + 3*z != nn )[/align]
[align=left] continue;[/align]
[align=left] [/align]
[align=left] // x + 2y + 3z == 100[/align]
[align=left] double t1 = ff( x );[/align]
[align=left] double t2 = ff( y );[/align]
[align=left] double t3 = ff( z );[/align]
[align=left] double t4 = ff( x + y + z );[/align]
[align=left] double tem = t4 / ( t1 * t2 * t3 );[/align]
[align=left] sum += tem;[/align]
[align=left] printf("%5d%5d%5d%50.0f/n", x, y, z, tem );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] //double sum = recursion1( 25 ); // 25 is the MAX number that I can bear![/align]
[align=left] double sum = recursion2( 100 );[/align]
[align=left] //double sum = no_recursion1( 100 );[/align]
[align=left] //double sum = no_recursion2( 100 );[/align]
[align=left] [/align]
[align=left] printf("/n/nsum is: %.0f", sum );[/align]
[align=left] printf("/n/nsum is: %.20G/n", sum );[/align]
[align=left] [/align]
}
[align=left]问题描述:[/align]
[align=left] [/align]
[align=left]100 个台阶, 每次可以走 1 或 2 或 3 个台阶, 走完这 100 个台阶共有多少种走法?[/align]
[align=left] [/align]
[align=left]基本思想:[/align]
[align=left]f(1) = 1;[/align]
[align=left]f(2) = 2;[/align]
[align=left]f(3) = 4;[/align]
[align=left]f(n) = f( n-1 ) 最后一步为 1[/align]
[align=left] + f( n-2 ) 最后一步为 2[/align]
[align=left] + f( n-3 ) 最后一步为 3[/align]
[align=left]*/[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]double recursion1( int n )[/align]
[align=left]{[/align]
[align=left] if( n == 1 )[/align]
[align=left] return 1;[/align]
[align=left] else if( n == 2 )[/align]
[align=left] return 2;[/align]
[align=left] else if( n == 3 )[/align]
[align=left] return 4;[/align]
[align=left] else [/align]
[align=left] {[/align]
[align=left] printf("%5d", n );[/align]
[align=left] return recursion1( n-1 ) + recursion1( n-2 ) + recursion1( n-3 );[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]double recursion2( int n )[/align]
[align=left]{[/align]
[align=left] /* [/align]
[align=left] 算法思想:[/align]
[align=left] 将已经算出的 数保存在 cash[] 中, 每次先在 cash[] 中查找, 如果找到则不再递归, 直接返回结果.[/align]
[align=left] */[/align]
[align=left] static double cash[100] = {0,1,2,4}; [/align]
if( cash
!= 0 )
return cash
;
[align=left] else[/align]
[align=left] {[/align]
[align=left] printf("%5d", n );[/align]
cash
= recursion2( n - 3 ) + recursion2( n-2 ) + recursion2( n-1 );
return cash
;
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double no_recursion1( int n )[/align]
[align=left]{[/align]
[align=left] if( n == 1 )[/align]
[align=left] return 1;[/align]
[align=left] else if( n == 2 )[/align]
[align=left] return 2;[/align]
[align=left] else if( n == 3 )[/align]
[align=left] return 4;[/align]
[align=left] [/align]
[align=left] double t_3 = 1; // record f( n-3 )[/align]
[align=left] double t_2 = 2; // record f( n-2 )[/align]
[align=left] double t_1 = 4; // record f( n-1 )[/align]
[align=left] double sum = 0;[/align]
[align=left] for( int i = 4; i <= n; i ++ )[/align]
[align=left] {[/align]
[align=left] // f(n) = f( n-1 ) + f( n-2 ) + f( n-3 )[/align]
[align=left] sum = t_1 + t_2 + t_3;[/align]
[align=left] [/align]
[align=left] // update f( n-1 ), f( n-2 ), f( n-3 )[/align]
[align=left] t_3 = t_2;[/align]
[align=left] t_2 = t_1;[/align]
[align=left] t_1 = sum;[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double ff( int end, int beg = 1 )[/align]
[align=left]{[/align]
[align=left] if( end == 0 || end == 1)[/align]
[align=left] return 1;[/align]
[align=left] [/align]
[align=left] double ss = 1;[/align]
[align=left] for( int i = beg; i <= end ; i ++ )[/align]
[align=left] ss *= i;[/align]
[align=left] return ss;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]double no_recursion2( int nn )[/align]
[align=left]{[/align]
[align=left] /* [/align]
[align=left] 算法思想:[/align]
[align=left] 找出满足 x + 2y + 3z == nn 的所有 x, y, z, 之后问题变成一个重集 B 上的全排列问题:[/align]
[align=left] 其中 B = { x.1, y.2, z.3 }, [/align]
[align=left] 公式为: nn!/( x! * y! * z! )[/align]
[align=left] (此处对阶乘算法没有进一步优化)[/align]
[align=left] */[/align]
[align=left] double sum = 0;[/align]
[align=left] for( int z = 0; z < 34; z ++ )[/align]
[align=left] {[/align]
[align=left] for( int y = 0; y < 51; y ++ )[/align]
[align=left] {[/align]
[align=left] for( int x = 0; x < 101; x ++ )[/align]
[align=left] {[/align]
[align=left] if( x + 2*y + 3*z != nn )[/align]
[align=left] continue;[/align]
[align=left] [/align]
[align=left] // x + 2y + 3z == 100[/align]
[align=left] double t1 = ff( x );[/align]
[align=left] double t2 = ff( y );[/align]
[align=left] double t3 = ff( z );[/align]
[align=left] double t4 = ff( x + y + z );[/align]
[align=left] double tem = t4 / ( t1 * t2 * t3 );[/align]
[align=left] sum += tem;[/align]
[align=left] printf("%5d%5d%5d%50.0f/n", x, y, z, tem );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] return sum;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]int main()[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] //double sum = recursion1( 25 ); // 25 is the MAX number that I can bear![/align]
[align=left] double sum = recursion2( 100 );[/align]
[align=left] //double sum = no_recursion1( 100 );[/align]
[align=left] //double sum = no_recursion2( 100 );[/align]
[align=left] [/align]
[align=left] printf("/n/nsum is: %.0f", sum );[/align]
[align=left] printf("/n/nsum is: %.20G/n", sum );[/align]
[align=left] [/align]
}
相关文章推荐
- "struts中文问题","struts国际化问题"的终极解决方案(转)
- 解决用<img src="<%# Eval("ShowPhoto")%>"动态绑定图片,发布到IIS上无法显示的问题
- <script language= "javascript " for= "window " event= "onload " /> 的问题解读
- 解决ssh的"Write failed: Broken pipe"问题
- "ScrollView can host only one direct child"问题解决
- "Microsoft Office Word 遇到问题需要关闭"如何
- "cannot locate symbol "sqlite3_enable_load_extension" referenced by "sqlite3" 问题解决
- sql-"无法删除数据库,因为该数据库当前正在使用"问题解决
- "undefined reference to" 问题解决方法
- 解决Discuz!NT"Code: 100, Message: 指定..."问题
- POJ 2125 --Destroying The Graph【最小割解决 "最小点权覆盖问题" && 输出解(割边集) && 各种不懂】
- "表名" si not mapped 问题
- "this class is not key value coding-compliant for the key ..."问题的解决
- 哥发明的 一个ssh整合时解决dao层代码冗余问题的"一点儿不漏"型抽取法!!!!
- 也谈论程序员的"尊重"问题
- "红色病毒"问题 + 数论
- 使用微信SDK时,出现了 "operator new[](unsigned long)", referenced from:等问题的解决方法
- "current buffer has no process" 问题解决
- "Your project contains error(s),please fix them before running your application"问题解决
- Qt creator的"纯c/c++项目"输出中文乱码的问题