This is a memoized version of naive recursion.
#include
#include
using namespace std;
#define MAX 1000
int dp[MAX][MAX];
int min_cost(int A[],int n,int start,int end)
{
if(dp[start][end]!=-1)
return dp[start][end];
if(start==end)
{ dp[start][end]=0;
return 0;
}
int i=A[start];
int j= A[end+1];
if(end-start==1)
return i*j*A[end];
int mini=12345678;
for(int k=start;k {
mini=min(mini,min_cost(A,n,start,k)+min_cost(A,n,k+1,end)+i*A[k+1]*j);
}
dp[start][end]=mini;
return mini;
}
int main()
{
for(int i=0;i for(int j=0;j dp[i][j]=-1;
int A[]={30,35,15,5,10,20,25};
int n= sizeof(A)/sizeof(A[0]);
printf("Minimum number of multiplications required are:%d\n",min_cost(A,n,0,n-2));
return 0;
}
#include
#include
using namespace std;
#define MAX 1000
int dp[MAX][MAX];
int min_cost(int A[],int n,int start,int end)
{
if(dp[start][end]!=-1)
return dp[start][end];
if(start==end)
{ dp[start][end]=0;
return 0;
}
int i=A[start];
int j= A[end+1];
if(end-start==1)
return i*j*A[end];
int mini=12345678;
for(int k=start;k
mini=min(mini,min_cost(A,n,start,k)+min_cost(A,n,k+1,end)+i*A[k+1]*j);
}
dp[start][end]=mini;
return mini;
}
int main()
{
for(int i=0;i
int A[]={30,35,15,5,10,20,25};
int n= sizeof(A)/sizeof(A[0]);
printf("Minimum number of multiplications required are:%d\n",min_cost(A,n,0,n-2));
return 0;
}
No comments:
Post a Comment