ACM中杨辉三角的多种解法
来源:互联网 发布:网络公司简介模图片 编辑:程序博客网 时间:2024/05/17 00:57
杨辉三角的多种解法
杨辉三角的相信大家很熟悉吧,但是大家能用多少中方法写出来呀,一般人都只会想到两种,递归和二项式。当用递推时,有时在解题是根本没必要需要那么多呀,而只要杨辉三角的某一行,数据小时,我们可以用二项式来计算,但是数据比较大时,二项式算也是很麻烦的,那么还有其它的方法吗?所以下面我就介绍几种计算杨辉三角的方法吧。
主要要记住第四种。。。。
一:二维数组
递推公式:f[1][1]=1 , f[i][j]=f[i-1][j-1]+f[i-1][j]
核心代码:
f[1][1]=0;for(int i=1;i<10;i++){ for(int j=1;j<=i;j++) { f[i][j]=f[i-1][j-1]+f[i-1][j]; }}
二:一维数组
思想:用一个一维数组把相邻两个数的和计算出来保存,到下一行时就输出。。。
代码:
#include <stdio.h>void main(){ int N = 13; /* 维数 */ int a[80] = {0}; int b[80] = {0}; int i, j; b[1]=1; for (i = 1; i <= N; i++) { for (j = 1; j <= i; j++) a[j] = b[j] + b[j-1]; for (j = 1; j <= i; j++) /* copy当前行a[]到b[]中以备下行的所用 */ { b[j] = a[j]; printf("%-6d", b[j]); } printf("\n"); } }
分析: 其思路是用一维数组做,实际上用的是两个一维数组a[], b[].其中a[]是保存当前行各元素的值, 而b[]可以认为是一个临时数组, 它是a[]的一个备份, 也就是说在每行a[]元素置数完毕后,将a[]中的内容拷贝到b[]中,因为进行下一行的运算时, a[]会被重置, 而且由杨辉三角的规律知下一行要用到上一行的元素, 这样在计算下一行的a[]时就可以用保存在b[]中的上一行的元素了(咋感觉这么啰嗦呢^_^)。也正因为如此, 在每一行运算完之后,就要将其输出显示, 下一行时a[]就是新值了。所以用这种方法最后程序结束时并没有将三角中所有元素保存下来,只是在程序运行过程中将其输出。
再看其程序的核心部分: a[j] = b[j] + b[j-1]; 其开始定义了数组a[80],b[80],0号元素并未使用,即每一行的元素都是从a[1]开始的。但这个0号元素是不是真的没用呢?稍加分析可知当然否,而且感觉这个0号元素用的挺巧妙,比如说到第5行时(其实与第几行没关系),输出第一个元素的语句是 a[1]=b[1]+b[0], 由于b[1]为1, 这时0号元素就派上用场了,b[0]为0, 可以将每一行的第一个元素置为1, 往下走有第二个元素 a[2]=b[2]+b[1]; ...开始按杨辉三角的规律走。同理,到最后一个元素时,a[5]=b[5]+b[4],在上一行中只有4个元素,即此时b[]中只有4个有效元素,那这个b[5]算什么呢?其实它跟那个0号元素有相同的作用,因为初始化时数组中的所有元素都置为0,所以这时的b[5]为0,由b[4]为1可得a[5]为1。这样可以将每一行的最后一个元素置为1。对于各行,此法均适用,实际上就是在满足杨辉三角两侧值均为1的规律。
三:二项式定理:
公式:第n行第i个数表示为C(n-1,r) 注:C(n,m)=n!/[m!(n-m)!]
代码:#include<cstdio>#include<iostream>using namespace std;int C(int n,int m){ int k=1,j=1,i; for(i=n;i>n-m;i--) { k=k*(i)/j; //注意组合数的算法,分子从大到小计算,分母从小到大计算 j++; } return k;}int main(){ int i,j; for(i=1;i<=10;i++) { for(j=0;j<i;j++) { printf("%d ",C(i-1,j)); } printf("\n"); } return 0;}
四:递推公式法:
这个方法接触还是在今年的多校联合的题目中hdu4927,不然我也不会知道这个方法,这个方法感觉跟二项式有点关系。。。。
这个方法就直接贴代码啦。
#include<cstdio>#include<iostream>using namespace std;int main(){ int b=1,i,j; for(i=1;i<10;i++) { b=1; for(j=1;j<=i;j++) { printf("%d\t",b); b=b*(i-j)/j; //核心部分 } printf("\n"); } return 0;}
貌似还有一些,但这儿就不介绍啦,主要要记住第四种。。。如想了解更多http://wenku.baidu.com/link?url=tqYsPVF_zoJMTaOqI6y7efjS4JP7cYxPxr_S_8C42aLNMrtoKUkz8MRxjNCB5W2otCAioiIzVpast2NoKfLr3CLzQAbFKRN9V61mMlZn6jO
- ACM中杨辉三角的多种解法
- 杨辉三角的多种解法
- POJ 1797 的多种解法
- 项目管理的三角难题与解法
- 项目管理的三角难题与解法
- 杨辉三角的三种解法
- 杨辉三角的几种解法。
- 最小的K个数的多种解法
- 一个数据库面试题的多种解法
- MATLAB电路问题的多种解法
- 一个枚举问题的多种解法
- 一道Erlang测试题的多种解法
- 交换两个数的值多种解法
- ACM准备之路(蓝桥杯4)杨辉三角数组解法
- ACM准备之路(蓝桥杯5)杨辉三角公式解法
- 变形的杨辉三角问题的一种解法
- 杨辉三角的变形问题ruby解法
- ACM UVa 116 - Undirectional TSP的解法
- 杭电1312 Red and Black(搜索入门)
- fread的第二个参数和第三个参数可以互换吗---为什么fread容易返回0 ?
- 自己撸个C++的String类(初学数据结构)
- Android 增量更新实例(Smart App Updates)
- getClass().getResourceAsStream() .获取配置文件的方法 .
- ACM中杨辉三角的多种解法
- HDU 1266 Reverse Number
- uboot配置分析(jz2440开发板)
- mappingResources、mappingLocations、mappingDirectoryLocations、mappingJarLocations区别
- Add two numbers-list,string
- 华为机试——03操作系统任务调度问题
- Ubuntu14.04 安装WineQQ 2013
- LeetCode | Interleaving String(交叉字符串)
- 杂文 ZOJ问题 hdoj 3788