-
Notifications
You must be signed in to change notification settings - Fork 378
/
动态规划迭代实现.java
101 lines (53 loc) · 2.43 KB
/
动态规划迭代实现.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
* 下面是矩阵连乘问题的动态规划算法
* 假设有6个矩阵:
* A1 A2A3 A4 A5A6
* 30*35 35*15 15*5 5*10 10*20 20*25 则matrixChain为
* {30, 35, 15, 5, 10, 20, 25} 结果为
* ((A1 * (A1 * A2)) * ((A4 * A5) * A6) )
*
* @author liuy
*/
public class MatrixMulitply {
public static void main(String[] args) {
int[] matrixChain = {30, 35, 15, 5, 10, 20, 25};
matrixMultiply(matrixChain);
}
//矩阵连乘
public static void matrixMultiply(int[] matrixChain) {
int dimension = matrixChain.length;
int[][] timeResult = new int[dimension][dimension];
int[][] tagResult = new int[dimension][dimension];
matrixMultiply(matrixChain, timeResult, tagResult);
System.out.println("最优乘法次数:" + timeResult[1][dimension - 1]);
System.out.println("划分规则为:");
traceBack(tagResult, 1, dimension - 1);
}
//矩阵连乘
public static void matrixMultiply(int[] matrixChain, int[][] timeResult, int[][] tagResult) {
//timeResult 存放次数结果,矩阵的的行与列以1开始,tagResult 存放标记结果,矩阵的的行与列以1开始
int n = matrixChain.length - 1;
for(int i = 1; i <= n; i++)//初始化矩阵
timeResult[i][i] = 0;
for(int r = 2; r <= n; r++)//从列号的第二位开始
for(int i = 1; i <= n - r + 1; i++ ) {//i为行号
int j = i + r - 1;//j为列号
timeResult[i][j] = timeResult[i + 1][j] + matrixChain[i - 1] * matrixChain[i] * matrixChain[j];
tagResult[i][j] = i;
for(int k = i + 1; k < j; k++) {//
int temp = timeResult[i][k] + timeResult[k + 1][j] + matrixChain[i - 1] * matrixChain[k] * matrixChain[j];
if(temp < timeResult[i][j]) {//寻找最小值
timeResult[i][j] = temp;
tagResult[i][j] = k;//记录划分标记
}
}
}
}
//按计算出断点矩阵tagResult指示的加括号方式
public static void traceBack(int[][] tagResult, int i, int j) {
if(i == j) return;
traceBack(tagResult, i, tagResult[i][j]);
traceBack(tagResult, tagResult[i][j] + 1, j);
System.out.println("Multiply A(" + i + "," + tagResult[i][j] + ")and A(" + (tagResult[i][j] + 1) + "," + j + ")");
}
}