實驗5 動態規劃實驗一

2021-08-20 22:44:37 字數 4033 閱讀 6381

oj練習

1. multiplication puzzle:

2. 【該題可以轉化為矩陣連乘問題】

3. common subsequence:

4. 【該題只需要輸出最長公共子串行的長度】

3*. human gene functions:human gene functions:變形】

4*. compromise:問題】

5*. agtc:問題】

6*.完美序列:

實驗內容

1. 最長公共子串行問題(lcs)。在使用動態規劃演算法來求解最長公共子串行時,二維陣列c[i][j]用於記錄序列xi和yj的最長公共子串行的長度,對於序列x = 和y = ,繪製對應的c[i][j]。

所繪製的c[i][j]陣列:

a   c   b   c

d a b d00

0000

000a 011

1111

11b 011

2222

22d0

1122

3333

c012

3333

33a 012

2334

44b 012

3334

55a 012

3334

55

最長公共子串行問題(lcs)。分別使用備忘錄法和動態規劃演算法求解最長公共子串行的長度。【輸入:兩個字串行;輸出:兩個字串行的最長公共子串行的長度。例如:輸入序列a = 「abcbdab」,序列b = 「bdcaba」;輸出4】

備忘錄法源**:

#include

#include

#include

#include

#define maxn 105

#define maxm 10005

#define inf 0x3f3f3f3f

using

namespace

std;

char a[maxn],b[maxn];

int dp[maxn][maxn],c[maxn][maxn];

int n,m;

int lcs1(int i, int j)

int main()}/*

abcbdab

bdcaba

*/

動態規劃演算法源**:

#include

#include

#include

#include

#define maxn 105

#define maxm 10005

#define inf 0x3f3f3f3f

using

namespace

std;

char a[maxn],b[maxn];

int dp[maxn][maxn],c[maxn][maxn];

int n,m;

void lcs1(int n, int m)

else

if(dp[i-1][j] >= dp[i][j-1])

else}}

}void lcs2(int i, int j)

else

if(c[i][j]==2)

else

}int main()}/*

abcbdab

bdcaba

*/

最長公共子串行問題(lcs)。在練習2**的基礎上,使用動態規劃演算法構造一條最長公共子串行。【輸入:兩個字串行;輸出:兩個字串行的一條最長公共子串行。例如:輸入序列a = 「abcbdab」,序列b = 「bdcaba」;輸出」bcab」(或其他任意一條長度為4的公共子串行)】

源**:

#include

#include

#define maxn 105

#define maxm 10005

#define inf 0x3f3f3f3f

using

namespace

std;

char a[maxn],b[maxn];

int dp[maxn][maxn],c[maxn][maxn];

int n,m;

void lcs1(int n, int m)

else

if(dp[i-1][j] >= dp[i][j-1])

else}}

}void lcs2(int i, int j)

else

if(c[i][j]==2)

else

}int main()}/*

abcbdab

bdcaba

*/

求如圖所示乙個上三角矩陣中每一條斜線中的最大元素(l)和最小元素(s)。

輸入:

1 3 5 7 11 20

6 8 2 3 13

7 4 8 9

18 3 10

12 6

15 輸出:

l1 = 18, s1 = 1

l2 = 8, s2 = 3

l3 = 10, s3 = 2

l4 = 9, s4 = 3

l5 = 13, s5 = 11

l6 = 20, s6 = 20

源**:

#include

#include

#include

#include

#include

#define maxn 105

#define maxm 10005

#define inf 0x3f3f3f3f

using

namespace

std;

int a[maxn][maxn];

int n,m;

int max = -inf, min = inf;

int main()

}for(int r=1; r<=n; r++)

cout

<< "l1 = "

<< max << ", "

<< "s1 = "

<< min << endl;

}return0;}

/*1 3 5 7 11 20

0 6 8 2 3 13

0 0 7 4 8 9

0 0 0 18 3 10

0 0 0 0 12 6

0 0 0 0 0 15

*/

5. 矩陣連乘問題。使用動態規劃演算法求解矩陣連乘問題。【輸入:乙個儲存矩陣維數的一維陣列;輸出:矩陣連乘最優計算次序。】
例如:

輸入:

一維陣列

輸出:

a[2:2] * a[3:3]

a[1:1] * a[2:3]

a[4:4] * a[5:5]

a[4:5] * a[6:6]

a[1:3] * a[4:6]

源**:

/*

#include

using namespace std;

#define n 7

void matrixchainorder(int

*p,int (*m)[n],int (*s)[n],int

length)

for(l=2;l<=n;l++)}}

}cout << dp[1][n-1] << endl;

}void dfs(int

**s, int i, int j)

; int

**s = new int

*[7];

int**dp = new int

*[7];

for (int i=0 ; i<7 ; ++i)

matrixchain(p,dp,s,6);

coutreturn

0;}

實驗6 動態規劃

一 實驗目的 1.通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想 運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用 二 實驗環境 visual c 實驗環境 三 實驗內容 寫出主要的內容 分析並掌握 最長公共子串行 問題的動態規劃演算法求解方法 最長公共子串行問題 若給定序列...

演算法實驗之動態規劃

設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 輸入結果儲存在1.txt中,輸出結果儲存在2...

演算法實驗六 動態規劃

一 實驗目的 通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想 運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用 二 實驗環境 dev c eclipse ide 三 實驗內容 1.分析並掌握 最長公共子串行 問題的動態規劃演算法求解方法 最長公共子串行問題 若給定序列x 則另...