dp-矩阵连乘


参考:http://blog.csdn.net/liufeng_king/article/details/8497607


使用备忘录算法复杂度降至O(n^3)

#include<stdio.h>
//A1 30*35 A2 35*15 A3 15*5 A4 5*10 A5 10*20 A6 20*25
//p[0-6]={30,35,15,5,10,20,25}
//m为备忘录,s为断开位置

//递归
int lookupchain(int i,int j,int p[],int m[][7],int s[][7])
{
    if(m[i][j]>0)
        return m[i][j];
    if(i==j)
        return 0;

    int ans=lookupchain(i+1,j,p,m,s)+p[i-1]*p[i]*p[j];
    s[i][j]=i;
    for(int k=i+1;k<j;k++)
    {
        int  t=lookupchain(i,k,p,m,s)+lookupchain(k+1,j,p,m,s)+p[i-1]*p[k]*p[j];
        if(t<ans)
        {
            ans=t;
            s[i][j]=k;
        }
    }
    m[i][j]=ans;
    return ans;
}

//迭代
int matrixChain(int n,int p[],int m[][7],int s[][7])
{
    for(int r=2;r<=n;r++)
        for(int i=1;i<=n-r+1;i++)
        {
            int j=i+r-1;
            m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
            s[i][j]=i;
            for(int k=i+1;k<j;k++)
            {
                int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                if(t<m[i][j])
                {
                    m[i][j]=t;
                    s[i][j]=k;
                }
            }
        }
    return m[1][6];
}

void Traceback(int i,int j,int s[][7])
{
    if(i==j) return;
    Traceback(i,s[i][j],s);
    Traceback(s[i][j]+1,j,s);
    printf("Multiply A%d,%d",i,s[i][j]);
    printf(" and A%d,%d\n",s[i][j]+1,j);
}

int main()
{
    int p[7]={30,35,15,5,10,20,25};
    int m[7][7]={},s[7][7]={};

    //printf("%d\n",lookupchain(1,6,p,m,s));
    printf("%d\n",matrixChain(6,p,m,s));

    // for(int i=0;i<7;i++)
    // {
    //     for(int j=0;j<7;j++)
    //         printf("%d ",m[i][j]);
    //     printf("\n");
    // }
    Traceback(1,6,s);
    return 0;
}
posted @ 2017-11-03 11:45  Neptune15  阅读(203)  评论(0编辑  收藏  举报