算法第三章作業


算法第三章作業

如果一個問題可以用動態規划算法解決,則總是可以在多項式時間內解決的。

T         F

1-2

最優二叉搜索樹的根結點一定存放的是搜索概率最高的那個關鍵字。

 F

1-3

用動態規划而非遞歸的方法去解決問題時,關鍵是將子問題的計算結果保存起來,使得每個不同的子問題只需要被計算一次。子問題的解可以被保存在數組或哈希散列表中。

T      

 

 

D、在動態規划中,我們要推導出一個子問題的解與其他子問題解的遞推關系。要將這種關系轉換為自底向上的動態規划算法,我們需要以正確的順序填寫子問題解的表格,使得在解任一子問題時,所有它需要的子問題都已經被解決了。在下列關系式中,哪一個是不可能被計算的? (2)

 

A(i,j)=min(A(i1,j),A(i,j1),A(i1,j1))

A(i,j)=F(A(min{i,j}1,min{i,j}1),A(max{i,j}1,max{i,j}1))

A(i,j)=F(A(i,j1),A(i1,j1),A(i1,j+1))

A(i,j)=F(A(i2,j2),A(i+2,j+2))

2-2

C、給定遞推方程 f

i,j,k

​​ =f

i,j+1,k

​​ +min

0lk

​​ {f

i1,j,l

​​ +w

j,l

​​ }

D、要通過循環解此方程,我們一定不能用下列哪種方法填表? (2)

 

for k in 0 to n: for i in 0 to n: for j in n to 0

for i in 0 to n: for j in 0 to n: for k in 0 to n

for i in 0 to n: for j in n to 0: for k in n to 0

for i in 0 to n: for j in n to 0: for k in 0 to n

2-3

切原木問題:給定一根長度為N米的原木;另有一個分段價格表,給出長度L=1,2,,M對應的價格P

L

​​ 。要求你找出適當切割原木分段出售所能獲得的最大收益R

N

​​ 。例如,根據下面給出的價格表,若要出售一段8米長的原木,最優解是將其切割為2米和6米的兩段,這樣可以獲得最大收益R

8

​​ =P

2

​​ +P

6

​​ =5+17=22。而若要出售一段3米長的原木,最優解是根本不要切割,直接售出。

 

Length L 1 2 3 4 5 6 7 8 9 10

Price P

L

​​ 1 5 8 9 10 17 17 20 23 28

下列哪句陳述是錯的?(3)

 

此問題可以用動態規划求解

NM,則有R

N

​​ =max{P

N

​​ ,max

1i<N

​​ {R

i

​​ +R

Ni

​​ }}

N>M,則有R

N

​​ =max

1i<N

 {Ri+RNM }算法的時間復雜度是O(N2 )

 

單調遞增最長子序列

設計一個O(n2)時間的算法,找出由n個數組成的序列的最長單調遞增子序列。

#include <iostream>

using  namespace std;

 

int dl(int a[], int b[],int n) {

      

  for (int i = 1; i < n; i++) {

 

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

{

if (a[j] < a[i]&& b[j]>b[i] - 1) {

b[i] = b[j] + 1;

}

}

}

    int t = b[1];

for (int  k = 0; k < n; k++)

{

           

 if (b[k] > t) {

 t = b[k];

 }

}

return t;

}

 

 

int main() {

int n;

cin >> n;

int *a = new int[n];

int *b = new int[n]();//置為0

for (int i = 0; i < n; i++) {

 

b[i]++;

}

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

{

cin >> a[i];

}

cout << dl(a, b, n);

system("pause");

}

 

 租用游艇問題 17 分)

題目來源:王曉東,《算法設計與分析》

 

長江游艇俱樂部在長江上設置了n個游艇出租站12,…,n。游客可在這些游艇出租站租用游艇,並在下游的任何一個游艇出租站歸還游艇。游艇出租站i到游艇出租站j之間的租金為r(i,j),1<=i<j<=n。試設計一個算法,計算出從游艇出租站1 到游艇出租站n所需的最少租金。

 

#include <iostream>

int dp[100][100];

int main()

{

int n;

scanf("%d",&n);

for(int i=1;i<n;i++)  

    {

    for(int j=i+1;j<=n;j++)

    {

scanf("%d",&dp[i][j]);

}

}

 

for(int k=2;k<n;k++)

{

for(int i=1;i<=n-k;i++)

{

int j=i+k;

for(int z=i+1;z<=j;z++)

{

int temp=dp[i][z]+dp[z][j];

if(dp[i][j]>temp)

dp[i][j]=temp;

}

}

}

 

printf("%d\n",dp[1][n]);

return 0;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM