一、實驗目的與要求
1、熟悉矩陣連乘問題的演算法;
2、初步掌握動態規劃演算法;
二、實驗題目
給定n個矩陣{a1,a2,…,an},其中ai與ai+1是可乘的,i=1,2…,n-1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。
三、實現思想
設計算a[i:j],1≤i≤j≤n,所需要的最少數乘次數m[i,j],則原問題的最優值為m[1,n]。
當i=j時,a[i:j]=ai,因此,m[i][i]=0,i=1,2,…,n
當i四、實現**
#includeusing namespace std;
void matrixchain(int *p,int n,int m[100],int s[100])
五、實驗結果
一、實驗目的與要求
1、熟悉最長公共子串行問題的演算法;
2、初步掌握動態規劃演算法;
二、實驗題
若給定序列x=,則另一串行z=,是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j=1,2,…,k有:zj=xij。例如,序列z=是序列x=的子串行,相應的遞增下標序列為。
給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。
給定2個序列x=和y=,找出x和y的最長公共子串行。
三、實現思想
最長公共子串行問題有最優子結構性質和子問題重疊性質,c[i][j]記錄集合a從1到i,和集合b從1到j的最長公共子串行的長度。a[i]=b[j],則最長子序列的最後乙個元素必為a[i]/b[j]。a[i]!=b[j]&&a[i]!=z[k],則最長子序列由集合a從1到i-1和集合b從1到j決定,集合b同理。
四、實現**
一、實驗目的與要求
1、熟悉最長最大欄位和問題的演算法;
2、進一步掌握動態規劃演算法;
二、實驗題
若給定n個整數組成的序列a1,a2,a3,……an,求該序列形如ai+ai+1+……+an的最大值。
三、實現思想
最大欄位和的思想簡單,這裡主要寫動態規劃的思想。
從頭開始,元素乙個乙個不斷加,和為負,直接捨棄;和為正,比較記錄最大元素的變數max,將較大的值賦給變數max
四、實現**
/* //直接邏輯實現
//時間複雜度為o(n^3)
#includeusing namespace std;
int main()
cout
int main()
} cout
int main()
else
b=a[i];
} cout五、實驗結果
一、實驗目的與要求
1、熟悉凸多邊形三角剖分問題的演算法;
2、進一步掌握動態規劃演算法;
二、實驗題
按照逆時針順序給定n凸多邊形的n個頂點座標,現在連線凸多邊形內部的頂點,使得凸多邊形分割為若干三角形,注意連線不可相交。每條線的權值為兩點之間的距離,所有連線的權值和為當前方案的權值,現在需要你計算所有方案中最小權值和。
輸入:輸入第一行包括乙個整數n,第2~n+1行,每行兩個整數x,y,代表乙個座標點,以空格間隔。
輸出:輸出一行1個浮點數代表最小權值,保留小數點後三位。
****** input:
40 0
1 01 1
0 1****** output:
1.414
三、實現思想
思想跟矩陣連乘問題完全相同。
尋找某點與基準邊構成乙個三角形,並將多邊形分割成兩個多邊形(與三角形都是最優子結構),再在剩下來的多邊形中繼續分割。
w函式計算的分割後三角形的三邊長之和,最終t中最大值儲存的是兩倍的弦長和邊長,因此最終的弦長需要減掉邊長,並除2.
四、實現**
#includeusing namespace std;
double t[100][100],s[100][100];
struct port
k[10];
double w(int a,int b,int c)
double bianchang(int n)
cout<
一、實驗要求與目的
1、 掌握動態規劃演算法求解問題的一般特徵和步驟。
2、 使用動態規劃法程式設計,求解影象壓縮問題。
二、實驗題目
問題描述:設某數字影象有n個畫素點,畫素點灰度值序列記為p[n],0 =< p[n] <= 255,則乙個畫素需要8位儲存。現在考慮將這n個畫素分成m個連續子段,每個子段儲存位數設為相同,這樣儲存,每個段需要額外的開銷記錄段長和段內儲存位數,為了減小段長記錄的開銷,規定段長最大為256位,現在給定畫素序列p[n],求儲存空間的最優值及最優解。
輸入第一行乙個整數n表示畫素點的個數。
輸入第二行n個整數p[i]表示各點畫素值。
輸出一行乙個整數,代表最優值。
****** input:
51 3 3 251 214
****** output:
44三、實現思想
演算法對畫素值組成的序列,從後向前分組,總共嘗試256次,找到其中最大的元素位數bmax和最小的最優序列元素位數之和s[i]。
四、實現**
計算機演算法設計與分析解題心得
先觀察問題的結構 解的形式,再設計演算法 能分解成子問題,是非常有效的資訊 優化問題時,下界很重要。給乙個問題,從最簡單的case入手 觀察input的關鍵結構,看能否分 能否combine 觀察output,不要堅持追求optimal,追求sub optimal。sample.手動執行最基本的演算...
演算法設計與分析 動態規劃
最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...
演算法設計與分析 動態規劃
分治技術的問題 子問題是相互獨立的 如果子問題不是相互獨立的,分治演算法將重複計算公共子空間,效率很低 提高效率的方法 從規模最小的子問題開始計算 用恰當資料結構儲存子問題的解,供以後查詢 確保每個子問題只求解一次 優化問題 給定一組約束條件和乙個代價函式,在解空間中搜尋具有最小或最大代價的優化解 ...