《编程之美》里面对求一维,二维的都进行了讲解。
1、一维中用动态规划可以使时间复杂度降到O(n).
思想:考虑数组中A[0],与最大的一段数组(A[i],...A[j])的关系
(1)、当0=i=j时,元素A[0]本身构成最大的一段
(2)、当0=i<j时,和最大的一段以 A[0]开始
(3)、当0<i时,元素A[0]与和最大一段没有关系
假设已经知道(A[1],...A[n-1])中和最大的一段数组之和为All[1],并且已经知道(A[1],...,A[n-1])中包含A[1]的和最大一段为start[1],那么A[0]到A[n-1]中和最大的一段为max(A[0],A[0]+start[1],All[1])
动态规划总是这样,分析最后的结果,然后累加中间步骤的小结果们。
2、二维中,假设已经确定了矩形区域的上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左右边界。
[img]http://dl.iteye.com/upload/picture/pic/98431/c77575a7-c8dd-36aa-add2-83684289b9dd.png[/img]
转化为一个一维问题,可以把每一列中第a行和第c行之间的元素看成一个整体。即求数组(BC[1],...BC[M])中和最大的一段,其中B[i] = B[a][i]+...B[c][i].
3、扩展问题;如果是三维数组呢?
我的问题是如果是高维数组呢?
----------------------------
其实不管多高维,都可以用二维数组的解法来解,三维数组就分解为两个二维平面。。对应于二维中的第a行和第c行,三维中就是第a个平面和第c平面;对应于二维中BC的数组,三维中就是BC平面。。
同样,四维就分为两个三维来做。。。
1、一维中用动态规划可以使时间复杂度降到O(n).
思想:考虑数组中A[0],与最大的一段数组(A[i],...A[j])的关系
(1)、当0=i=j时,元素A[0]本身构成最大的一段
(2)、当0=i<j时,和最大的一段以 A[0]开始
(3)、当0<i时,元素A[0]与和最大一段没有关系
假设已经知道(A[1],...A[n-1])中和最大的一段数组之和为All[1],并且已经知道(A[1],...,A[n-1])中包含A[1]的和最大一段为start[1],那么A[0]到A[n-1]中和最大的一段为max(A[0],A[0]+start[1],All[1])
动态规划总是这样,分析最后的结果,然后累加中间步骤的小结果们。
int max(int x,int y){
return (x > y) ? x : y;
}
int maxSum(int* A, int n){
start[n-1] = A[n-1];
All[n-1] = A[n-1];
for(i = n-2; i>=0; i--){
start[i] = max(A[i], A[i]+start[i+1]);
all[i] = max(start[i],all[i+1]);
}
} return all[0];
2、二维中,假设已经确定了矩形区域的上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左右边界。
[img]http://dl.iteye.com/upload/picture/pic/98431/c77575a7-c8dd-36aa-add2-83684289b9dd.png[/img]
转化为一个一维问题,可以把每一列中第a行和第c行之间的元素看成一个整体。即求数组(BC[1],...BC[M])中和最大的一段,其中B[i] = B[a][i]+...B[c][i].
3、扩展问题;如果是三维数组呢?
我的问题是如果是高维数组呢?
----------------------------
其实不管多高维,都可以用二维数组的解法来解,三维数组就分解为两个二维平面。。对应于二维中的第a行和第c行,三维中就是第a个平面和第c平面;对应于二维中BC的数组,三维中就是BC平面。。
同样,四维就分为两个三维来做。。。