问题描述:
已知:给定一深度为n的带权完全二叉树。现对该树进行搜索,规则为:搜索从根节点开始,至任意叶节点结束;只能从上至下搜索;只能沿当前节点的左子节点或右子节点搜索。设搜索路径的代价函数为路径上所有节点权值之和
求:搜索路径的最小代价
输入:第1行为深度n;第2行至第n+1行为各节点权值
输出:最小搜索代价
Sample Input:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output:
30
思路:
将二叉树节点权值保存至一个二维矩阵V(下三角形矩阵)中,设e(i, j)表示以节点v(i, j)为根节点向叶节点最小搜索代价,则有如下递归表达式
即当前节点为根的最小搜索代价,只与当前节点的权值以及其左右子节点为根的最小搜索代价有关
代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int v[360][360];
int e[360][360];
int n;
int dp(){
for(int j = 0; j < n; j++)
e[n-1][j] = v[n-1][j];
for(int i = n-2; i >= 0; i--){
for(int j = 0; j <= i; j++)
e[i][j] = v[i][j] + ((e[i+1][j] > e[i+1][j+1]) ? e[i+1][j] : e[i+1][j+1]);
}
return e[0][0];
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++){
for(int j = 0; j <= i; j++)
scanf("%d", &v[i][j]);
}
printf("%d\n", dp());
return 0;
}