(集合上的动态规划)最有矩阵链乘模板!!!!

来源:互联网 发布:myeclipse可视化编程 编辑:程序博客网 时间:2024/06/06 05:53

 

 //还没想出来怎样输出加了括号后结果??????

 

#include<iostream>
#include<stdio.h>
using namespace std;
const int N=3;//N为矩阵个数
int p[N+1];//p[i]表示矩阵维数从0到N,
int m[N+1][N+1];//min[i][j]用递推法时记录A[i]*....a[j]的最优计算次数
int s[N+1][N+1];//记录分点位置
int matrixcchain_recursion(int* p,int start,int end)//初始时(p,1,N);
{
 int temp;
 int min=0xffff;
 if(start>=end)
  return min=0;
 for(int k=start;k<end;k++)//枚举每两个矩阵之间的乘号
  {
   temp=matrixcchain_recursion(p,start,k)+matrixcchain_recursion(p,k+1,end)+p[start-1]*p[k]*p[end];
   if(temp<min)
    min=temp;

  }
 return min;

 }

int matrixcchain_nonrecursion(int* p,int start,int end)//初始时(p,1,N);
{

 for(int i=start;i<=end;i++)
  m[i][i]=0;
 //由于长区间的值依赖于短区间的值,故按照j-i递增的顺序递推;
 for(int d=2;d<=end;d++)//d表示的是i,j之间的矩阵个数(包括i,j)
  {
   for(int i=start;i<=end-d+1;i++)
    {
     int j=i+d-1;
     //初始化,即分点为i;(i)(i+1,。。,j)
     m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];
     s[i][j]=i;
     //枚举中间的分点
     int temp;
     for(int k=i+1;k<j;k++)
      {
       temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
       if(temp<m[i][j])
       {
        m[i][j]=temp;
        s[i][j]=k;
       }
      }

    }
   }

}
//输出加了括号的序列
void trace(int *s,int start,int end)
{
  //还没想出来怎样输出加了括号后结果??????


 }
int main()
{
 for(int i=0;i<=N;i++)
 scanf("%d",&p[i]);
 //递归的解
 printf("%d/n",matrixcchain_recursion(p,1,N));
 //非递归求解
 matrixcchain_nonrecursion(p,1,N);
 printf("%d/n",m[1][N]);

 return 0;
}

原创粉丝点击