目录
前言
矩阵取数问题 其实是 数塔取数问题的变形,类似导航问题
问题
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。例如:3 * 3的方格。
1 3 3
2 1 3
2 2 1
能够获得的最大价值为:11。
数据结构
图:
代码:
// 初始化
public ListNode initData(){
/**
* 1
* 2 3
* 2 1 3
* 2 3
* 1
*/
ListNode data40 = new ListNode(1);
ListNode data30 = new ListNode(2,null,data40);
ListNode data31 = new ListNode(3,data40,null);
ListNode data20 = new ListNode(2,null,data30);
ListNode data21 = new ListNode(1,data30,data31);
ListNode data22 = new ListNode(3,data31,null);
ListNode data10 = new ListNode(2,data20,data21);
ListNode data11 = new ListNode(3,data21,data22);
ListNode data00 = new ListNode(1,data10,data11);
minData(data00);
return data00;
}
// 树节点
public class ListNode {
int value;
int pathValue;
ListNode left;
ListNode right;
ListNode() {}
ListNode(int value) {
this.value = value;
}
ListNode(int value, ListNode left,ListNode right) {
this.value = value;
this.left = left;
this.right = right;
}
}
计算
data.pathValue = data.value + Math.max(minData(data.left) , minData(data.right));
如果是导航问题,这里应该是最短距离
@Test
public void test1(){
// 初始化数组
ListNode data = initData();
// 计算pathValue
minData(data);
System.out.println("最小值为:" + data.pathValue);
}
private int minData(ListNode data){
if(data == null){
return 0;
}
data.pathValue = data.value + Math.max(minData(data.left) , minData(data.right));
return data.pathValue;
}
附录
end