動態規劃演算法三個例題

2021-10-03 04:04:08 字數 2923 閱讀 2601

/**

* @author yang

* @create 2020-02-23 16:05

* @description 有8個任務 每個任務有不同的開始和結束時間以及價值,在時間不衝突的情況下如何使價值達到最高。

*/public

class

dynamicplan

/** *

* @param n 查詢做第n個任務後可以做的前乙個任務的序號

* @return 可以做的前乙個任務的序號

*/public

static

intpre

(int n)

}//沒有可做的

return0;

}/**

** @param n 給定的任務個數

* @return 最大收益

*/public

static

intopt

(int n)

//否則採用遞迴返回

//分兩種情況

//1.當執行第n個任務時,同時累加其可以完成的第pre(n)個任務

//2.當不執行第n個任務時,計算第n-1個任務

//返回兩者的最大值

return

(math.

max(

opt(n-1)

,tasks[n]

.getvalue()

+opt

(pre

(n))))

;}}//任務類

class

task

public

intgetbegin()

public

intgetend()

public

intgetvalue()

}

***

@author yang

*@create

2020-02

-2317:

13*@description 有乙個陣列int

arr =

; 要求選定乙個元素後不能選擇與其相鄰的元素,

* 然後使元素相加。問如何能達到最大? */

public

class

dynamicpaln2

; system.out.

println

(opt2

(arr,6)

);}//非遞迴方法,演算法複雜度為n,避免重複計算相同的子問題

public

static

intopt

(int

arr)

return opt[arr.length -1]

;}//遞迴方法,演算法複雜度為2的n次方

/** *

* @param arr 陣列

* @param n arr陣列中元素的個數

* @return

*/public

static

intopt2

(int

arr,

int n)

if(n ==1)

//當n>2時,分以下兩種情況

//1.選定第n個元素時,將第n個元素的值arr[n] 與 第n-2個元素的函式返回值相加

//2.不選第n個元素時,則計算第n-1個元素的返回值

//比較以上兩種情況的最大值

return math.

max(

opt2

(arr,n -1)

,arr[n]

+opt2

(arr,n-2)

);}}

/**

* @author yang

* @create 2020-02-23 17:53

* @description 給定乙個陣列 int arr = ;,從陣列裡挑選數字相加能否等於給定的數字

*/public

class

dynamicplan3

;//測試

system.out.

println

(dp_subsent

(arr,9)

);}//通過遞迴解決

/** *

* @param arr 給定的陣列

* @param i 陣列的長度

* @param s 給定的數字

* @return 能拼出返回true,否則返回false

*/public

static

boolean

rec_subsent

(int

arr,

int i,

int s)

if(i ==0)

if(arr[i]

> s)

//正常情況

//1.選取第i個元素,然後用s-arr[i]作為新的s代入遞迴函式

//2.不選取第i個元素,選取第i-1個元素,此時s不變

//兩者有乙個為true即可

return

rec_subsent

(arr,i-

1,s-arr[i])||

rec_subsent

(arr,i-

1,s);}

//非遞迴解決

public

static

boolean

dp_subsent

(int

arr,

int s)

//正常情況

for(

int i =

1; i < arr.length; i++

)else}}

return subsent[arr.length -1]

[s];

}}

動態規劃演算法例題

題目 有乙個序列 3,5,9,0,2,8,3,9,5,9,2,8 取其中不相鄰子串行,求可能的最大值是多少?思路 用動態規劃來求解。對於最後乙個元素,可以分成兩種情況,取還是不取。如果取,那麼我們在8的基礎上再加上前10個元素組成的序列求得的最大值,如果不取,那麼我們考慮前11個元素組成的序列即可。...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...