1、连续子数组的最大和–动规求解
例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。
如果用函数dp(i)表示以第i个数字结尾的子数组的最大和,那么我们只需要求出
max[dp(i)],其中可以用如下递归公式。
当i=0时,或者dp(i-1)<=0时,dp(i)=array[i];
当i≠0时,或者dp(i-1)>0时,dp(i)=dp(i-1)+array[i];
function FindGreatestSumOfSubArray(array) {
let max = array[0]
let dp = []
for (let i = 0; i < array.length; i++) {
if (i == 0 || dp[i - 1] <= 0) {
dp[i] = array[i]
} else {
dp[i] = dp[i - 1] + array[i]
}
max = dp[i] > max ? dp[i] : max
}
return max
}
2、求最长不下降序列
在一个数字序列中,找到一个最长的子序列,可以不连续,使得这个子序列是不下降的(非递减的)
样例
1 2 3 -1 -2 7 9
最长不下降的子序列是 1 2 3 7 9,长度为5
同用动规求解,与上题亦有异曲同工之妙
function FindGreatestSumOfSubArray(array) {
// write code here
let a = array
let max = array[0]
const dp = []
for (i = 0; i < a.length; i++)//这个循环是求从i为1到n所有数字前面的最长不下降序列,并把数字保存在f数组中
{
dp[i] = 1;
for (j = 1; j < i; j++) {
if (a[j] <= a[i] && dp[j] + 1 > dp[i])//不下降意味着可以等于
dp[i] = dp[j] + 1;
}
if (dp[i] > max) {
max = dp[i];//每次一个数字循环完,都要求出最长的不下降序列
k = i;//并记录下标,k为最长的不下降序列的下标
}
}
return { max, k }
}