题意:给出n个矩阵组成的序列,问最少的运算量
看的紫书: dp[i][j]表示从第i个矩阵到第j个矩阵最少的乘法次数
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]);
边界条件为dp[i][i]=0,因为从一个矩阵自己到它自己不需要做乘法 然后把dp[i][j]初始化为一个极大的值,再来求最小值
学习的这一篇:http://blog.csdn.net/dgq8211/article/details/7492186
还有这一篇:http://blog.csdn.net/u012804490/article/details/26152337
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 #define mod=1e9+7; 12 using namespace std; 13 14 15 typedef long long LL; 16 const int maxn=105; 17 const int INF = 0x7fffffff; 18 int dp[maxn][maxn],p[maxn]; 19 20 int main(){ 21 int n,i,j,ans,k,len; 22 while(scanf("%d",&n)!=EOF&&n){ 23 for(i=1;i<=n;i++) cin>>p[i-1]>>p[i]; 24 25 memset(dp,0,sizeof(dp)); 26 27 for(len=1;len<n;len++){ //连乘的矩阵的长度 28 for(i=1;i<=n-len;i++){ //连乘的矩阵的起点 29 j=i+len; 30 dp[i][j]=INF; 31 for(k=i;k<j;k++){ //连乘的矩阵的终点 32 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]); 33 // printf("dp[%d][%d]=%d ",i,j,dp[i][j]); 34 } 35 } 36 } 37 printf("%d ",dp[1][n]); 38 } 39 return 0; 40 }
go---go---go-