算法导论学习笔记(十一):动态规划(一)

来源:互联网 发布:java视频点播系统 编辑:程序博客网 时间:2024/05/21 14:04

装配线调度

#include<iostream>using namespace std;int a[3][7], t[3][7], e[3], x[3];int f[3][7], l[3][7];int n = 6;/***************************************************** l[i][j]存储经过装配站j-1所在装配线** f[1][0]和f[2][0]存储最短时间** l[1][0]和l[2][0]存储最后一个装配站所在装配线***************************************************/void Fastest_Way (){f[1][1] = e[1] + a[1][1];f[2][1] = e[2] + a[2][1];for (int j = 2; j <= n; j++){if (f[1][j - 1] + a[1][j] <= f[2][j - 1] + t[2][j - 1] + a[1][j]){f[1][j] = f[1][j - 1] + a[1][j];l[1][j] = 1;}else{f[1][j] = f[2][j - 1] + t[2][j - 1] + a[1][j];l[1][j] = 2;}if (f[2][j - 1] + a[2][j] <= f[1][j - 1] + t[1][j - 1] + a[2][j]){f[2][j] = f[2][j - 1] + a[2][j];l[2][j] = 2;}else{f[2][j] = f[1][j - 1] + t[1][j - 1] + a[2][j];l[2][j] = 1;}}if (f[1][n] + x[1] <= f[2][n] + x[2]){f[1][0] = f[2][0] = f[1][n] + x[1]; l[1][0] = l[2][0] = 1;}else{f[1][0] = f[2][0] = f[2][n] + x[2];l[1][0] = l[2][0] = 2;}}void Print_Stations (){int i = l[1][0];int j;cout << "最快装配路线:" << endl;cout << "line " << i << ", station " << n << endl;for (j = n; j > 1; j--){i = l[i][j];cout << "line " << i << ", station " << j - 1 << endl;}}void Input (){int i, j;cout << "输入在装配站S(i,j)的装配时间a(i,j):" << endl;for (i = 1; i <= 2; i++){for (j = 1; j <= n; j++){cin >> a[i][j];}}cout << "输入进入装配线i的花费时间e(i):" << endl;for (i = 1; i <= 2; i++)cin >> e[i];cout << "输入从s(i,j)站转移到另一条装配线的时间t(i,j):" << endl;for (i = 1; i <= 2; i++){for (j = 1; j < n; j++){cin >> t[i][j];}}cout << "输入从装配线i离开的花费时间x(i):" << endl;for (i = 1; i <= 2; i++)cin >> x[i];}int main(){Input ();Fastest_Way ();Print_Stations ();system ("pause");return 0;}


矩阵链乘法

#include<iostream>using namespace std;#define M 1000000int n;int m[101][101] = {0};int s[101][101] = {0};void Matrix_Chain_Order (int* p){for (int i = 1; i <= n; i++)m[i][i] = 0;for (int l = 2; l <= n; l++){int i, j, k, q;for (i = 1; i <= n - l + 1; i++){j = i + l - 1;m[i][j] = M;for (k = i; k < j; k++){q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];if (q < m[i][j]){m[i][j] = q;s[i][j] = k;}}}}}void Print_Optimal_Parens (int i, int j){if (i == j)cout << 'A' << i;else{cout << '(';Print_Optimal_Parens (i, s[i][j]);Print_Optimal_Parens (s[i][j] + 1, j);cout << ')';}}int main(){int p[101];while (cin >> n){for (int i = 0; i <= n; i++)cin >> p[i];Matrix_Chain_Order (p);cout << m[1][n];Print_Optimal_Parens (1, n);cout << endl;}return 0;}


原创粉丝点击