348 - Optimal Array Multiplication Sequence

来源:互联网 发布:我打打单软件 编辑:程序博客网 时间:2024/05/01 15:52
/*典型动态规划题型,一次AC题意:矩阵相乘,要求输出运算次数最少的运算式思路:以第k个乘号为一个状态,状态方程:d(x1,x2)={max(d(x1,k)+d(k+1,x2)+x1*k*x2)|k属于[x1,x2)}使用数组ans[x1][x2]存储相应的k值,最后使用递归输出!*/#include <cstdio>#include <cstring>const int nMax=15;long long d[nMax][nMax];int A[nMax][2];int ans[nMax][nMax];int N;int dp(int x1,int x2){long long &temp=d[x1][x2];if(temp!=-1) return temp;//temp=0;for(int k=x1;k<x2;k++){if(temp==-1){ans[x1][x2]=k;temp=dp(x1,k)+dp(k+1,x2)+A[x1][0]*A[k][1]*A[x2][1];}else if(dp(x1,k)+dp(k+1,x2)+A[x1][0]*A[k][1]*A[x2][1]<temp){ans[x1][x2]=k;temp=dp(x1,k)+dp(k+1,x2)+A[x1][0]*A[k][1]*A[x2][1];}}return temp;}void print(int x1,int x2){if(x1==x2) {printf("A%d",x1+1);return;}printf("(");print(x1,ans[x1][x2]);printf(" x ");print(ans[x1][x2]+1,x2);printf(")");}int main(){//freopen("f://data.in","r",stdin);int cas=1;while(scanf("%d",&N) && N){for(int i=0;i<N;i++){scanf("%d%d",&A[i][0],&A[i][1]);}memset(d,-1,sizeof(d));dp(0,N-1);printf("Case %d: ",cas++);print(0,N-1);printf("\n");}return 0;}

原创粉丝点击