第三章作业

一、对动态规划的理解

基本思想:把所要求解的问题划分为许多个子问题,但子问题之间是有联系,最后求出子问题的最优解即原问题的最优解了。

(与分治法不同的是,需要求得每次子问题最后得出最优解。)

 具体步骤:

1、划分子问题,确定子问题边界

2、推得方程式

3、求出边界条件

4、填表

二、

#include <iostream>
using namespace std;
#define ARRAYMAX 100

int main() {
int n, max = 0, a[ARRAYMAX], longest[ARRAYMAX] = { 1 };
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (a[i] > a[j] && longest[i] < longest[j] + 1)
longest[i] = longest[j] + 1;
}
if (max < longest[i])
max = longest[i];
}
cout << max << endl;
return 0;
}
2、
#include <iostream>
using namespace std;
#define ARRAYMAX 200

int minRent(int r[][ARRAYMAX], int n) {
for (int i = 1; i < n; i++) {
for (int j = i+1; j <= n; j++) {
int t = r[i][j];
for (int k = i; k <= j; k++) {
if (t > r[i][k] + r[k][j])
t = r[i][k] + r[k][j];
}
r[i][j] = t;
}
}
return r[1][n];
}

int main() {
int r[ARRAYMAX][ARRAYMAX] = { 0 };
int n;
cin >> n;
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
cin >> r[i][j];
}
}
cout << minRent(r, n) << endl;
return 0;
}

 

posted on 2019-11-03 23:42  mars0604  阅读(115)  评论(0编辑  收藏  举报