解決方案,假設opt陣列為最優解,比如opt[6]就表示arr陣列中下標0到6這段的最優解
即opt[n]=math.max(opt[n-1],opt[n-2]+arr[n])
上訴公式表示不取下標為n的選項和取下標為n的選項兩種方案的最大值
邊界為 opt[0]=arr.get(0) opt[1]=math.max(arr.get(0),arr.get(1)),還是比較好理解的。
/**
* 獲取陣列arr中不相鄰的數字相加最大值
* @param arr
* @return
*/private static integer getmaxvalue(listarr)else if(length.equals(2))
if(list.get(length-1)>result)
boolean a = containsubset(list, length - 2, result - list.get(length - 1));
boolean b = containsubset(list, length - 1, result);
return a || b;
}
/**
* 動態規劃 求list陣列中不相鄰的數字和是否可以為result()
* @param list
* @param result
* @return
*/private static boolean dp_subset(listlist,integer result)else
}} //showarr(arr);
return arr[list.size() - 1][result];
}
動態規劃方案不太好理解,這裡舉例
list為5, 4, 3, 1, 6, 2, 7
,result為12
0 1 2 3 4 5 6 7 8 9 10 11 12
5 true false false false false true false false false false false false false
4 true false false false true true false false false false false false false
3 true false false true true true false false true false false false false
1 true true false true true true true false true false false false false
6 true true false true true true true false true true true true false
2 true true true true true true true true true true true true false
7 true true true true true true true true true true true true true
縱座標為list陣列中的具體值,橫座標為result
每個座標的意思就是在子陣列中是否存在不相鄰的和為座標值的組合
比如arr[2,4]表示5,4,3三個子集中是否存在不相鄰的組合和為4
可以明星看出最右下角的二維陣列值就是要的結果。
這兩個問題都差不多
/**
* * @param n 第幾個金礦
* @param w 總共有幾個人
* @param g 陣列,存放每個金礦的**數
* @param p 陣列,存放每個金礦需要的工人數
* @return
*/public static int getmostglodfordp2(int n, int w, int g, int p) ;
int p = ;
getmostglodfordp2(5, 10, g, p);
0 0 0 0 0 400 400 400 400 400 400
0 0 0 0 0 500 500 500 500 500 900
0 0 0 200 200 500 500 500 700 700 900
0 0 0 200 300 500 500 500 700 800 900
0 0 0 350 350 500 550 650 850 850 900
橫向為人數(橫向第一列表示人數0,1個人,2個人,3個人。。。),縱向為金礦
可以一目了然的看出每新增一座金礦,10個人的收益情況
上訴**最難理解的就是這塊int b = g[i] + arr[i - 1][j - p[i]];
**的意思就是,採集這塊金礦收益+剩餘人數採集其他金礦的最大收益
其實這裡只要其他金礦收益,只要兩個一維陣列就可以了,這裡方便
/**
* 動態規劃方式
* @param s
* @return
*/private static string mytestcode(string s)else
}if(dp[i][j]&&(j-i+1)>maxlen)
}} return s.substring(begin, begin + maxlen);
}
漫畫:什麼是動態規劃?
經典動態規劃:0-1 揹包問題
看動畫輕鬆理解「遞迴」與「動態規劃」
動態規劃解題套路框架
演算法-動態規劃 dynamic programming--從菜鳥到老鳥
**我對動態規劃的一點理解---大家準備好小板凳,我要開始吹牛皮了~~~
動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...
動態規劃演算法
動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...
動態規劃演算法
動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...