矩阵链乘(动态规划)

来源:互联网 发布:vb.net 窗体应用程序 编辑:程序博客网 时间:2024/04/29 10:15
 核心语句:ans=min(ans,d[i][k]+d[k+1][j]+m[i]*m[k+1]*m[j+1]); 其中m[i]*m[k+1]*m[j+1]可以类比普通求矩阵的代码#include <stdio.h>#include <string.h> int m[1005]; int d[1005][1005]; int n; int min(int a,int b) {     return a<b?a:b; } int dp() {     int len,i,j,k;     int ans;     memset(d,0,sizeof(d));     for (len=1;len<n;len++)//len+1表示一个括号内有几个矩阵(len = 1,代表矩阵链由两个矩阵构成 )        for (i=1,j=i+len;j<n;i++,j++)//i代表起点是第i个矩阵,j代表终点是第j个矩阵     {         ans=999999;         for (k=i;k<j;k++)//k代表是断点,求从第i个矩阵到第j个矩阵的最小值一定是求第i个矩阵到第k个矩阵的最小值,第k个矩阵最小值到第j个矩阵的最小值,再把这两个矩阵相乘(这是m数组所表示的代价)            ans=min(ans,d[i][k]+d[k+1][j]+m[i]*m[k+1]*m[j+1]);         d[i][j]=ans;     }     return d[1][n-1]; } int main() {     int i;//从1~n-1个矩阵     while(scanf("%d",&n)==1)     {         for (i=1;i<=n;i++)           scanf("%d",&m[i]);//比如3个矩阵,则n=4,第一个矩阵1行两列,第二个矩阵2行3列,第三个矩阵3行4列,则书写方式为1 2 3 4           printf("%d\n",dp());     }     return 0; }

0 0