励志用少的代码做高效表达
题目描述:
杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要。
第0行: 1
第1行: 1 1
第2行: 1 2 1
第3行: 1 3 3 1
第4行: 1 4 6 4 1
…
两边的元素都是1, 中间的元素是左上角的元素与右上角的元素和。
我们约定,行号,列号都从0计数。
所以: 第6行的第2个元素是15,第3个元素是20
直观地看,需要开辟一个二维数组,其实一维数组也可以胜任。
如下程序就是用一维数组“腾挪”的解法。
分析与思考
代码填空题一般来讲都是考查递归或递推(因为其他的也没什么好考查的, 一个调试就出来了)。 相对来说是三种题型中技巧性最高、也是不太容易得分的一道题。
这里讲一讲我解代码填空的技巧
首先确定他的题型, 如果不是递归或递推,只是输出某种图案或结构,那么直接采用输出测试、注释、调试等手段, 慢慢可以试出答案。
如果是递归、回溯、递推等题型,那么就需要先手算出大致的推理过程, 最后填入代码。 如本题就是一道递推题, 我们先将n等于2,3,4,5分别求出, 根据初始条件推理如何才能得到这种解, 一层一层的分析, 最后可以比较容易的得到递推公式。
当然, 今天离蓝桥杯省赛还有两天的时间, 如果觉得自己对递归了解不够,不具备这样的能力, 那就瞎试吧, 成功率也是蛮高的。
总结一下技巧:手算推导、输出测试、注释输出、调试、随机测试(瞎试) (如果对你产生了帮助, 记得给博主一个赞哟)
上程序
#include<bits/stdc++.h>
using namespace std;
long long f(int row, int col){
if(row<2) return 1;
if(col==0) return 1;
if(col==row) return 1;
long long a[1024];
a[0]=1;
a[1]=1;
int p = 2;
int q;
while(p<=row){
a[p] = 1;
for( q=p-1;q>0;q-- ) a[q] = a[q] + a[q-1]; //填空
p++;
}
return a[col];
}
int main()
{
printf("%d\n", f(6,2));
printf("%d\n", f(6,3));
printf("%lld\n", f(40,20));
return 0;
}