摘桃子(YOJ2.0中的题)
猜猜看我们老师给这个题的标签是啥
递归回溯
而且难度还是在所有题中最难的(名义上,难度最高是6),刚开始我是想用递归来解的,虽然猴子是从下往上爬,但是从上往下递归解也是可以的
然后我就感觉不对劲了,这不是可以用动态规划来秒杀吗?
从最底下往上一层的那一层开始算,从第一个数开始,加上下面一层可能到达这个位置的两个数中最大的那一个(这样到达这个数的时候,这个位置的数就是一定要到达这个位置的路径中最大的),然后一直运算到最后一个,接着上一层一样逻辑的运算
到了最高一层就是最大的那个数(可以用例子试一下)
这不比递归的计算量低得多?
代码如下:
#include<stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int tree[n][n];
for(int i = 0; i < n; i++)
for(int j = 0; j <= i; j++)
scanf("%d", &tree[i][j]);
for(int i = n - 2; i >= 0; i--)
for(int j = 0; j <= i; j++)
tree[i][j] += (tree[i + 1][j] > tree[i + 1][j + 1]) ? tree[i + 1][j] : tree[i + 1][j + 1];
printf("%d", tree[0][0]);
return 0;
}
短小精悍
我简直就是秒杀了这一题,笑稀了