由买买提看人间百态

topics

全部话题 - 话题: pathmin
(共0页)
l*n
发帖数: 529
1
来自主题: JobHunting版 - G onsite面经 加求blessing
前面的递归还少了左方和上方pathmin相等时的处理。
下面的code我还用brutal force的比较过,用http://stackoverflow.com/questions/5498130/bit-manipulationprint-the-next-smallest-and-largest-numbers-with-same-no-of-1-b的nexthi_same_count_ones生成每个路径的01表示,两者能够match上。左方和上方pathmin相等时的情况就是用brutal force发现的。
int initStr(int[][] mat) {
assert (mat != null && mat.length > 0 && mat[0].length > 0);
int m = mat.length;
int n = mat[0].length;

int[][] accu = new int[m][n]; //cumulative
int[][] pathmin = new int[m][n];
for... 阅读全帖
l*n
发帖数: 529
2
来自主题: JobHunting版 - G onsite面经 加求blessing
你是对的,楼上楼也提到pathmin跟accu的冲突,我原来想的错误比较是用pathmin[i,
j-1]跟pathmin[i-1, j],即便修正为比较"考虑了accu的"从上面和左边进入的两个假
想pathmin,也无法解决局部和全局的问题。每次比较进入[i,j]的两个假想的pathmin
,也可能会错过全局的最优,因为可能存在的情况是某个在中途不是给出最优pathmin
的路径反而能给出全局最优。
一个反例就是
6 -12 4 13
-1 -9 5 -3
-5 -11 -16 -17
-8 -13 5 -8
每次都要求进入当前位置的pathmin为最优导致选择-1 -9 5 ...的路径,其pathmin是-
1 -10 -10,但是在5的位置accu是-5,而brutal force给出的路径是-12 4 5...,在5
位置的accu是-3,而其pathmin是-12 -12 -12...。
这种局部最优策略跟全局最优的冲突,极端起来怕是每一处都需要走两条线。看来这个
harry potter的题目只能brutal force了。
l*n
发帖数: 529
3
来自主题: JobHunting版 - G onsite面经 加求blessing
确实,greedy思路走岔了,不过在考虑greedy accu怎么着路径的时候发现必须要有两
个matrix来dp,一个是accu, 一个是pathmin。
accu(i, j)=pathmin(i-1, j)>pathmin(i, j-1)?
accu(i-1, j)+input(i, j):
accu(i, j-1)+input(i, j);
pathmin(i, j)=pathmin(i-1, j)>pathmin(i, j-1)?
min(pathmin(i-1, j), accu(i, j)):
min(pathmin(i, j-1), accu(i, j));

better
l*n
发帖数: 529
4
来自主题: JobHunting版 - G onsite面经 加求blessing
这样来分析吧。假设我们用brutal force方法解了问题,那么我们能够知道走到最右下
角时符合题设的路径中的最低strength。能对最右下角做,也就能对任何坐标点做。假
设现在知道了pathmin(i, j-1)和pathmin(i-1,j),也就是当坐标的左边和上边,那为
了走到当前坐标会如何走?进当前坐标格只有两个入口,或者左或者上,显然选的是
pathmin高的那个。一旦入口选定了,当前坐标的累计值accu就决定了,然后当前坐标
格的pathmin也就决定了。
这里pathmin不是记录的某个path的最低streng,而是所有能走到当前坐标格的路径中
最优路径的最低accu值。

is
l*n
发帖数: 529
5
来自主题: JobHunting版 - G onsite面经 加求blessing
accu(accumulate)如其名字,是记录最优的path走到当前位置的累计值。
pathmin是走到当前位置的最优路径的最小accu值,假设路径上input矩阵的值是2>>5>>
-3>>-2>>4>>2的话,accu就是2>>7>>4>>2>>6>>8,而一路上pathmin的值是2>>2>>2>>2>
>2>>2。
这里ifelse的逻辑就是,进入某一个位置只能是从左边或者上边的cell,左边cell的
pathmin值比上边的pathmin要高的话,初始需要的strength就更低,所以从左边进入当
前cell。
l*********b
发帖数: 1541
6
来自主题: JobHunting版 - G onsite面经 加求blessing
虽然左边的pathmin比较高,但是上边的accu可能比较大。比如:左边的pathmin比较大
,但是accu是10,上边的accu是20, 当前cell的stength是-15,这时候要选上边的吧?

>>
2>
w*******s
发帖数: 138
7
来自主题: JobHunting版 - G onsite面经 加求blessing
Harry Potter是二分搜索答案,对于每个答案,用DP判断是否可行。
一开始随便找一条路设初始值。

,
pathmin
pathmin
l*n
发帖数: 529
8
来自主题: JobHunting版 - G onsite面经 加求blessing
我在调试,一会儿post。
你这个1>>1>>1>>1>>-5>>0的情况,对应的accu是1>>2>>3>>4>>-1>>-1,
而pathmin是1>>1>>1>>1>>-1>>-1,应该是对的。

>(
l*********b
发帖数: 1541
9
来自主题: JobHunting版 - G onsite面经 加求blessing
if (lefmin > upmin) {
accu[i][j] = accu[i][j - 1] + mat[i][j];
} else if (lefmin < upmin) {
accu[i][j] = accu[i - 1][j] + mat[i][j];
}
上面两个if/else不是很明白, 感觉不能推出上面两个吧。。 请问你这个pathmin和
accu分别代表啥?
(共0页)