【动态规划】矩阵连乘问题
代码实现:
#include<stdio.h>
#include<string.h>
int m[10][10],p[10],s[10][10];
int n;
void find_s()
{
int r,j,i,t,k;
for(r=2;r<=n;r++)
{
for(i=1;i<=n-r+1;i++)
{
j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(k=i+1;k<j;k++)
{
t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(m[i][j]>t)
{
m[i][j]=t;
s[i][j]=k;
}
}
}
}
}
void print_(int i,int j)
{
if(i==j)
printf("A%d",i);
else if(i+1==j)
printf("(A%dA%d)",i,j);
else
{
printf("(");
print_(i,s[i][j]);
print_(s[i][j]+1,j);
printf(")");
}
}
int main()
{
p[0]=30;p[1]=35;p[2]=15;
p[3]=5;p[4]=10;p[5]=20;
p[6]=25;
n=6;
memset(s,0,sizeof(s));
memset(m,0,sizeof(m));
find_s();
print_(1,n);
printf("\n");
return 0;
}