首页 > 代码库 > poj 1651

poj 1651


hnldyhy
// poj 1651 矩阵连乘 DP
#include <iostream>
#include <string.h>
using namespace std;
int dp[103][103],s[103];
int main()
{ int n,i,j,k,min;
cin>>n;
for(i=1;i<=n;++i) cin>>s[i];
memset(dp,0,sizeof(dp));
for(i=n-2;i>=1;--i)
for(j=i+2;j<=n;++j)
{ min=i+1;
for(k=i+2;k<=j-1;++k)
if((dp[i][k]+dp[k][j]+s[i]*s[j]*s[k])<(dp[i][min]+dp[min][j]+
s[i]*s[j]*s[min])) min=k;
dp[i][j]=dp[i][min]+dp[min][j]+s[i]*s[j]*s[min];
}
cout<<dp[1][n]<<endl;
return 0;
}

 

*************************************************************************

 

1651 poj 递归
#include <iostream>
#include<string.h>
using namespace std;
int dp[105][105],p[105],n;
int min(int a,int b) { return a>b?b:a ; }

int f(int x,int y)
{ int t,i ;
if(x==y) return dp[x][y]=0;
else
{ t=f(x,x)+f(x+1,y)+p[x-1]*p[x]*p[y];
for(i=x+1; i<y; i++)
t=min(t,f(x,i)+f(i+1,y)+p[x-1]*p[x]*p[y]);
return dp[x][y]=t ;
}
}
int main( )
{
while(cin>>n)
{
for(int i=0; i<n ; i++)
cin>>p[i] ;
memset(dp,-1,sizeof(dp));
f(1,n-1);
cout<<dp[1][n-1];
}

}