• 矩阵相乘


    简单的ABC矩阵连乘这里就不写代码了,现在说说关于ABCDEF....矩阵连乘问题的计算顺序问题:

    递归解法:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 #define SIZE 100
     7 #define INF 999999999
     8 int m[SIZE];
     9 int n;
    10 int memo[SIZE][SIZE];
    11 int Best_Memo(int m[], int left, int right);
    12 
    13 //m数组内存放矩阵链的行列信息
    14 //m[i-1]和m[i]分别为第i个矩阵的行和列(i = 1、2、3...)
    15 int Best_Enum(int m[], int left, int right)
    16 {
    17     //只有一个矩阵时,返回计算次数0
    18     if (left == right)
    19     {
    20         return 0;
    21     }
    22 
    23     int min = INF; //无穷大
    24     int i;
    25     //括号依次加在第1、2、3...n-1个矩阵后面,每次加括号的方式是一样的,所以可以递归。 
    26     for (i = left; i < right; i++)
    27     {
    28         //计算出这种完全加括号方式的计算次数
    29         int count = Best_Enum(m, left, i) + Best_Enum(m, i+1, right);
    30         count += m[left-1] * m[i] * m[right];
    31         //选出最小的
    32         if (count < min)
    33         {
    34             min = count;
    35         }
    36     }
    37     return min;
    38 }
    39 
    40 
    41 int main(void)
    42 {
    43     scanf("%d", &n);
    44     for (int i = 0; i < n; i++)
    45     {
    46         scanf("%d", &m[i]);
    47     }
    48 
    49 //    printf("%d
    ", Best_Enum(m, 1, n-1));
    50     memset(memo, 0, sizeof(memo));
    51     printf("%d
    ", Best_Memo(m, 1, n-1));
    52     return 0;
    53 }
    54 
    55 
    56 //Best_Enum() 的优化 
    57 int Best_Memo(int m[], int left, int right)
    58 {
    59     //只有一个矩阵时,返回计算次数0
    60     if (left == right)
    61     {
    62         return 0;
    63     }
    64 
    65     int min = INF;
    66     int i;
    67     //括号依次加在第1、2、3...n-1个矩阵后面
    68     for (i = left; i < right; i++)
    69     {
    70         //计算出这种完全加括号方式的计算次数
    71         int count;
    72         if (memo[left][i] == 0)//如果没有计算过,就进入递归来计算 
    73         {
    74             memo[left][i] = Best_Memo(m, left, i);
    75         }
    76         count = memo[left][i]; //如果计算过,就直接用 
    77         
    78         if (memo[i+1][right] == 0)
    79         {
    80             memo[i+1][right] = Best_Memo(m, i+1, right);
    81         }
    82         count += memo[i+1][right];
    83         
    84         count += m[left-1] * m[i] * m[right];//加上代价 
    85         //选出最小的
    86         if (count < min)
    87         {
    88             min = count;
    89         }
    90     }
    91     return min;
    92 }

    动态规划解法:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 #define MAX 99999999
     5 int n;
     6 int data[105];
     7 
     8 int main(){
     9     cin>>n;
    10     memset(data,-1,sizeof(data));
    11     for(int i=0;i<n;i++ ){
    12         cin>>data[i];
    13     }
    14     
    15     int result[n+1][n+1];
    16     memset(result,0,sizeof(result));
    17     
    18     for(int s=1;s<=n-1;s++){
    19         for(int i=1,j=i+s;j<n;i++,j++){
    20             int min=MAX;
    21             for(int k=i;k<j;k++){
    22                 int count=result[i][k]+result[k+1][j]+data[i-1]*data[k]*data[j];
    23                 if(count<min){
    24                     min=count;
    25                 }                    
    26             }
    27             result[i][j]=min;
    28         }
    29     }
    30     
    31     cout<<result[1][n-1];
    32 } 
  • 相关阅读:
    linux安装skype
    (转)程序员最应该读的图书
    Smarty 学习笔记六 缓存
    Smarty 学习笔记二 常用内置变量
    Smarty 学习笔记七 debug
    文本文件与二进制文件区别
    zz 通用线程:Awk 实例,第 2部分
    MIT墙上的格言
    AWK学习笔记
    zz SED单行脚本快速参考 以及 AWK版本
  • 原文地址:https://www.cnblogs.com/liugl7/p/4987245.html
Copyright © 2020-2023  润新知