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 則另...