UVA348矩阵链乘

来源:互联网 发布:淘宝一口价宝贝有效期 编辑:程序博客网 时间:2024/05/12 12:14

经典的DP题,表达式结构,个人认为记忆化搜索比递推简单些,而且更容易理解,这里贴上代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cctype>#include<cmath>#include<algorithm>#include<string>#include<map>#include<queue>#include<stack>#include<set>#include<vector>#define LL long longusing namespace std;const int maxn=1e5+10;const double eps=1e-6;const int  MAX_INT=(1<<31)-1;int x[15],y[15];int n;int d[15][15],r[15][15]; int dp(int a,int b){if(d[a][b]!=-1) return d[a][b];r[a][b]=a;if(a==b)  return d[a][b]=0;d[a][b]=MAX_INT;int t;for(int i=a;i<b;i++){t=dp(a,i)+dp(i+1,b)+x[a]*y[i]*y[b];if(t<d[a][b]){d[a][b]=t;r[a][b]=i;}}return d[a][b];}void print(int a,int b){if(a>b) return;if(a==b)printf("A%d",a+1);else{printf("(");print(a,r[a][b]);printf(" x ");print(r[a][b]+1,b);printf(")");}}int main(){//cout<<MAX_INT;int cas=0;while(cin>>n&&n){memset(d,-1,sizeof(d));for(int i=0;i<n;i++)cin>>x[i]>>y[i];dp(0,n-1); printf("Case %d: ", ++cas);          print(0, n - 1);      cout<<endl;}    return 0;}


0 0