1. 程式人生 > >動態規劃算法相關問題

動態規劃算法相關問題

不同 amp 而後 分解 隊友 根據 int 編程 分治

1.對動態規劃算法的理解

基本思想:

動態規劃算法是將待求解的問題分解成若幹個子問題,先求子問題,然後從這些子問題的解得到原問題的解。但與分治法不同,適合於用動態規劃法求解的問題,經分解得到的子問題往往不是互相獨立的。為了避免有些子問題被重復計算了很多次,可以用一個表來記錄所有已解決的子問題的答案,不管該子問題以後是否被用到,只要它被計算過,就將其結果填入表中。

基本步驟:

(1)找出最優解的性質,並刻畫其結構特征

(2)遞歸地定義最優解

(3)以自底向上的方式計算出最優解

(4)根據計算最優值時得到的信息,構造最優解。

基本要素:

(1)最優子結構:當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。

(2)重疊子問題:動態規劃算法利用子問題的重疊性質,對每一個子問題只解一次,而後將其解保存在一個表格裏,當再次需要解此子問題時,只是簡單地用常數時間查看一下結果。

(3)備忘錄方法:備忘錄方法的控制結構與直接遞歸方法的控制結構相同,區別在於備忘錄方法為每個解過的子問題建立了備忘錄以備需要時查看,避免了相同子問題的重復求解。備忘錄方法的遞歸方式是自頂向下的

2.編程題

(1)編程一遞歸方程:

for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (a[i] > a[j] && m[j] + 1 >m[i]) {
m[i] = m[j] + 1;

if (max < m[i]) {
max = m[i];
}
}
}
}

(2)編程二遞歸方程:

for(m=2;m<=n;m++) { //到第m個站點
for(int i=1;i<=n-m+1;i++) { //從每一個站點開始
int j=m+i-1; //r(i,j)的長度為j
for(k=i;k<=j;k++) { //找出某一站k,使r(i,k)+r(k,j)最小
min=a[i][k]+a[k][j];
if(a[i][j]>min) {
a[i][j]=min;
}
}
}
}

3.結對編程情況

其實跟隊友線下交流編程還是蠻少的,不過遇到問題的時候還是可以找隊友互相討論,一起解決。

動態規劃算法相關問題