數組輪流取頭或尾的最大值

 遞推關係爲:

M(left,right) = max(v[left] + L(left + 1,right) , v[right] + L(left, right - 1))
       其中L(left,right) = Sum(left, right) - M(left, right) 
package lianxi_1;

//有一個數組,a,b輪流取數字,每次只能從頭或尾取,問先取的人最多取多少?
//暫時基於遞歸實現,動態規劃遞推式是有了,不過遞推式中依賴更高index的項,不知咋辦了。。
public class Exercise14 {

	static int max(int[] a, int i, int j) {
		int sum = 0;
		while (i <= j) {
			sum += a[i];
			i++;
		}
		return act(a, sum, 0, a.length - 1);
	}

	private static int act(int[] a, int sum, int l, int r) {
		int lmax, rmax;
		if (r - l > 1) {
			// 意思是先選一個,然後求剩下數組對方先選獲得的最大值,用sum減去對方獲得的最大值,即是自己的最大值
			// 然後比較選頭還是尾更好
			lmax = sum - act(a, sum - a[l], l + 1, r);
			rmax = sum - act(a, sum - a[r], l, r - 1);
			return lmax > rmax ? lmax : rmax;
		} else {//剩下2個
			return a[l] > a[r] ? a[l] : a[r];
		}

	}

	public static void main(String[] args) {
		int v[] = { 1, 2, 3, 6, 9, 5, 7, 4, 2, 6, 9, 5, 8, 7, 2, 1, 55, 3, 6, 9, 7, 5, 2 };
		int n = max(v, 0, v.length - 1);
		System.out.println(n);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章