建议在 TBOJ 观看。
这道题目看起来还是有一些难度的,我们要仔细观察这个图形才能看出结果。
我们先把图形搬上来。
1 3 8 20 48
3 2 5 12 28
8 5 3 7 16
20 12 7 4 9
48 28 16 9 5
我们可以很轻松的找出来这个左上到右下的对角线的数值是一个差值为 1 1 1 的等差数列,我们可以写出这样的代码:
for(int i=1;i<=n;i++)maap[i][i]=i;
那我们还有两块还没又解决呢。
不急,其实这只有一块,你仔细看看上面的图形,他还是在某种意义上来说是对称的(对称轴好像是 y = − x y=-x y=−x )
咳咳……不扯太多了。
我们沿着我们的已知信息–对角线来找,点 ( 2 , 1 ) (2,1) (2,1) 上的数是 3 3 3 。那我们就想,这个 3 3 3 怎么来的呢?
在尝试了一些跟 3 3 3 有关的等差数列,差等差数列之后,你就发现好像并没有什么明显的规律数列。
但是,这时,我们还是要往已知的地方看,往 3 3 3 的上面(已知的)一看!
它的上面是 1 1 1 。它的左边呢?
是我们已知的 2 2 2 。
这还不明显吗?
1 + 2 = 3 1+2=3 1+2=3
接着我们可以在验证几个(在图形右下方的数)。
8 = 3 + 5 8=3+5 8=3+5
好像确实有这么个规律。
我们就能写出右下角这一大块的数了。
代码:
for(int i=2;i<=n;i++){
for(int j=i-1;j>=1;j--){
maap[i][j]=maap[i-1][j]+maap[i][j+1];
}
}
注意(小思考):这处代码的第二层循环的 j j j 的枚举是从大到小循环的,想一想,是因为什么呢?
这时,我们想起来,刚刚还发现了一个规律:
他还是在某种意义上来说是对称的(对称轴好像是 y = − x y=-x y=−x )
那我们就可以写出这样一个代码来把右下角的数转化为左上角的数咯,代码如下:
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
maap[i][j]=maap[j][i];
}
}
此篇题解如有错误,请私信:
ZKY2506–TBOJ
zhangkeyuan0623–luogu
我们下次再见!