• 动态规划


    矩阵链相乘:求出计算乘积A1A2...An所需标量乘法最少的方案

    算法方法简介:我们使用以空间换取时间的方法,采用自底向上表格法代替递归式。算法使用一个辅助表m[1...n][1..n]保存计算矩阵Ai..j所需标量乘法的最小次数,用s[1..n][2...n]记录最优值的分割点,然后使用表s构造最优解。其中m[i,j]=m[i,k]+m[k+1,j]+pi-1pkpj,其中k是分割点,它只有j-i种可能的取值:k=i,i+1,...j-1。

    代码1:

    View Code
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define ArrS 6
     4 
     5 int matrix_value(int i,int j,int m[][ArrS+1],int Num1,int p[],int s[][ArrS+1]);
     6 void show(int s[][ArrS+1],int i,int j);
     7 
     8 int main()
     9 {
    10 int s[ArrS+1][ArrS+1]={0}; 
    11 int m[ArrS+1][ArrS+1]={0};
    12 int p[ArrS+1]={30,35,15,5,10,20,25};
    13 
    14 int i,j,L;
    15 
    16 for(j=0;j<ArrS;j++)
    17 for(i=1;i+j<=ArrS;i++)
    18 m[i][i+j]=matrix_value(i,i+j,m,ArrS+1,p, s);
    19 
    20 
    21 printf("Show the position[i][j]:\n"); 
    22 for(i=1;i<=ArrS;i++)
    23 {
    24 for (j=1;j<=ArrS;j++)
    25 printf("%d ",s[i][j]);
    26 printf("\n");
    27 }
    28 
    29 
    30 printf("\n\nThe path is:\n");
    31 show(s,1,6);
    32 
    33 system("PAUSE"); 
    34 return 0;
    35 }
    36 
    37 int matrix_value(int i,int j,int m[][ArrS+1],int Num1,int p[],int s[][ArrS+1])
    38 {
    39 if(j==i)
    40 {
    41 s[i][j]=i;
    42 return 0;
    43 }
    44 
    45 int k,min;
    46 min=p[i-1]*p[i]*p[j]+m[i+1][j];
    47 s[i][j]=i;
    48 for(k=i+1;k<j;k++)
    49 if(min>p[i-1]*p[k]*p[j]+m[i][k]+m[k+1][j])
    50 {
    51 min=p[i-1]*p[k]*p[j]+m[i][k]+m[k+1][j];
    52 s[i][j]=k;
    53 }
    54 
    55 return min;
    56 }
    57 
    58 void show(int s[][ArrS+1],int i,int j)
    59 //用递归的方法去显示完整路径,调用的方式是 show(1,n)
    60 {
    61 if (j<=i)
    62 return;
    63 int a;
    64 a=s[i][j];
    65 printf("position[%d][%d]=%d \n",i,j,s[i][j]);
    66 show(s,i,a);
    67 show(s,a+1,j);
    68 }

     代码2:

    View Code
     1 #include <vector>
     2 #include <iostream>
     3 using namespace std;
     4 int m[100][100];
     5 int vz[100][100];
     6 class MattrixCM
     7 {
     8 public:
     9     int cal(vector<int> v)//计算最少乘法次数
    10     {
    11         int i=0,n=v.size()-1,j=0;
    12         int l,k,temp;
    13         for(i=0;i<n;i++)
    14             m[i][i]=0;
    15         for(l=2;l<=n;l++)
    16         {
    17             for(i=0;i<=n-l;i++)
    18             {
    19                 j=i+l-1;
    20                 for(k=i;k<j;k++)
    21                 {
    22                     if(k==i)
    23                     {
    24                         m[i][j]=m[i][k]+m[k+1][j]+v[i]*v[i+1]*v[j+1];
    25                         vz[i][j]=k;
    26                     }
    27                     else
    28                     {
    29                         temp=m[i][k]+m[k+1][j]+v[i]*v[k+1]*v[j+1];
    30                         if(temp<m[i][j])
    31                         {
    32                             m[i][j]=temp;
    33                             vz[i][j]=k;
    34                         }
    35                     }
    36                 }
    37             }
    38         }
    39         return m[0][n-1];
    40     }
    41     void printResult(int i,int j)//输出最优加括号方式
    42     {
    43         if(i==j)
    44             cout<<"A"<<i+1;
    45         else
    46         {
    47             cout<<"(";
    48             printResult(i,vz[i][j]);
    49             printResult(vz[i][j]+1,j);
    50             cout<<")";
    51         }
    52 
    53     }
    54 };
    55 int main()
    56 {
    57     vector<int> v;
    58     v.push_back(30);v.push_back(35);v.push_back(15);v.push_back(5);
    59     v.push_back(10);v.push_back(20);v.push_back(25);
    60     MattrixCM mcm;
    61     cout<<mcm.cal(v)<<endl;
    62     mcm.printResult(0,5);
    63     cout<<endl;
    64     system("pause");
    65     return 0;
    66 }
  • 相关阅读:
    复合梯形公式、复合辛普森公式 matlab
    拉格朗日插值和牛顿插值 matlab
    数值分析 最小二乘 matlab
    最短路径Dijkstra matlab
    最小生成数 克鲁斯卡尔 普里姆 matlab
    [ 9.9 ]CF每日一题系列—— 259A黑白棋盘检查问题
    Tarjan求缩点化强连通图
    CF每日一题系列 —— 415A
    [kuangbin]树链剖分 C
    [kuangbin]树链剖分 D
  • 原文地址:https://www.cnblogs.com/sanshuiyijing/p/3022447.html
Copyright © 2020-2023  润新知