您的位置:首页 > 其它

15.2 动态规划

2013-10-05 11:47 155 查看
15.2.1

为了计算,实现了书中的代码。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#include <cassert>
#include <cmath>
#include <algorithm>
using namespace std;

#define MAX 110
#define INFINITE 1111111
int m[MAX][MAX];
int s[MAX][MAX];

void matrix_chain_order(int *p, int len_p)
{
int len = len_p - 1;
for (int i = 0; i < len; i++)
m[i][i] = 0;

for (int length = 2; length <= len; length++) {
for (int i = 0; i <= len - length; i++)
{
int j = length + i - 1;
m[i][j] = INFINITE;
for (int k = i; k <= j - 1; k++)
{
int tmp = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1];
if (tmp < m[i][j])
{
m[i][j] = tmp;
s[i][j] = k;
}
}
}
}
}

void print_result(int i, int j)
{
if (i == j) {
printf(" A%d ", i + 1);
return;
}
else
{
int k = s[i][j];
printf("(");
print_result(i, k);
//printf(")(");
print_result(k + 1, j);
printf(")");
}
}

int main(int argc, const char * argv[])
{
//int p[] = {30, 35, 15, 5, 10, 20, 25};
int p[] = {5, 10, 3, 12, 5, 50, 6};
matrix_chain_order(p, sizeof(p) / sizeof(p[0]));
printf("%d\n", m[0][sizeof(p) / sizeof(p[0]) - 2]);
print_result(0, sizeof(p) / sizeof(p[0]) - 2);
return 0;
}


15.2.2

写出伪代码很简单,但是实现上因为不清楚如何返回一个二维的数组,所以暂未实现。

15.2.3
15.3中有,所谓替换法似乎就是类似于归纳法的东西?

15.2.4

直接按照TATRIX-CHAIN-ORDER的代码统计第9行的执行次数,然后*2就可以了。

15.2.5

每加一个括号就少一个元素,因此最后剩下一个元素时候,加了n-1个括号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: