华为2016年机试题 第三题详解

来源:互联网 发布:陌陌滚刀软件安卓 编辑:程序博客网 时间:2024/05/07 10:18

题目记得不太清了,大概意思是:一个数组,都是正整数,最多连续取两个,求如何取取得的数相加和最大。


这是一个比较基础的动态规划问题,可以按照常规的状态递推思路。 开辟数组data[3][n], 令data[0][n] 表示数组arr中第n个数不选,data[1][n]表示数组arr中第n个数选,第n-1个数不选,data[2][n]表示第n和第n-1个数选了。这类问题主要推导出迁移公式就好做了,见代码:

java 代码如下:

public class HWPro3 { public static void main(String arg[]){    int[] data = {1,9,1,9,9,9,9};    System.out.println(maxValue(data));   }  public static int maxValue(int[] data){     int N = data.length;    if(N<=2){      return (N==1)?data[0]:(data[0]+data[1]);    }  int[][] arr = new int[N][3];    arr[1][0] = data[0];  arr[1][1] = data[1];  arr[1][2] = data[0]+data[1];   for (int i = 2; i < N; i++) {  //状态迁移公式,动态规划核心部分  arr[i][0] = max(arr[i-1][0], arr[i-1][1], arr[i-1][2]);  //第i个数不选时  arr[i][1] = arr[i-1][0]+data[i];   //第i个数选,第i-1个数不选时  arr[i][2] = arr[i-1][1]+data[i];   //第i个数选,第i-1个数也选时}  return max(arr[N-1][0], arr[N-1][1],arr[N-1][2]);}  public static int max(int a, int b){     return a>b?a:b;  }  public static int max(int a,int b,int c){    return a>b&&a>c?a:(b>c?b:c);  }}



1 0
原创粉丝点击