校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 算法 > 动态规划算法
题目

求出数组A中互不相邻的数的最大和。如数组A=[1,2,4,1,7,8,3]

解答

发现从0开始推导不出结果,只能取一个一般状态,如果现在是第i个位置,f(i)表现在i位置的最大和。自然就转化为动态规划问题。

推导出中间状态公式:max(dp[i-2]+num[i],dp[i-1])

* 递归解法
             * @param arr
             * @param i
             * @return
             */
          public static int rec_opt(int[] arr, int i) {
                       if(i == 0)
                                  return arr[0];
                       else if (i == 1)
                                  return Math.max(arr[0], arr[1]);
                       else {
                                  int a = rec_opt(arr, i-2) + arr[i];
                                  int b = rec_opt(arr, i-1);
                                  return Math.max(a, b);
                                  }
}

/**
 * 动态规划解法
 * @param arr
 * @return
 */
public static int dp_opt(int[] arr) {
             int[] opt = new int[arr.length];
             opt[0] = arr[0];
             opt[1] = Math.max(arr[0], arr[1]);
             for(int i=2; i<arr.length; i++) {
                        int a = opt[i-2] + arr[i];
                        int b = opt[i-1];
                        opt[i] = Math.max(a, b);
             }
             return opt[arr.length-1];
}

C 6条回复 评论
禾下乘凉

小偷盗窃题,不偷挨边户

发表于 2021-06-26 09:38:05
0 0
赫本

很牛逼的算数题

发表于 2020-12-05 12:38:54
0 0
往事四块七毛五

字数限制。。。

发表于 2020-08-18 12:34:13
0 0
往事四块七毛五

for (int i=2; i opt[i]=Math.max(opt[i-2]+num[i],num[i-1]);
}
for (int i=0;i int max = Math.max(max,opt[i+1]);
}

发表于 2020-08-18 12:33:41
0 0
五分i

Dp[i]=max(Dp[i-2]+A[i],Dp[i-1])

发表于 2020-08-18 10:44:30
0 0
HaterGone

Dp[i]=max(Dp[i-2]+A[i],Dp[i-1])

发表于 2020-08-18 10:35:06
0 0