/**
* @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問題 最長...