• hoj1249 Optimal Array Multiplication Sequence 矩阵链乘


    矩阵链乘法:
    矩阵P={}


    标准模板:
    for(int i=2;i<=n;i++)
    for(int j=1;j<=n-i+1;j++)
    {
    int temp = i+j-1;
    dp[j][temp] = 1000000000;
    for(int k=j;k<=temp-1;k++)
    {
    v = dp[j][k]+dp[k+1][temp]+p[j-1]*p[k]*p[temp];
    if(v<dp[j][temp])
    {
    dp[j][temp] = v;
    s[j][temp] = k;
    }
    }
    }
    相乘次数(答案) = dp[1][n]

    打印最佳链乘表达式:
    void print(int i,int j)
    {
    if(i==j)
    cout<<"A"<<i;
    else
    {
    cout<<"(";
    print(i,s[i][j]);
    //cout<<"*";是否带乘号*
    print(s[i][j]+1,j);
    cout<<")";
    }
    }


    #include <iostream>
    #include <cstring>
    using namespace std;
    #define X 11
    int p[X];
    int dp[X][X];
    int s[X][X];
    void print(int i,int j)
    {
    if(i==j)
    cout<<"A"<<i;
    else
    {
    cout<<"(";
    print(i,s[i][j]);
    cout<<" x ";
    print(s[i][j]+1,j);
    cout<<")";
    }
    }
    int main()
    {
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    int n;
    int counter = 0;
    int x,y,v;
    while(cin>>n,n)
    {
    counter++;
    for(int i=1;i<=n;i++)
    {
    cin>>x>>y;
    p[i-1] = x;
    }
    p[n] = y;
    for(int i=1;i<=n;i++)
    dp[i][i] = 0;

    for(int i=2;i<=n;i++)
    for(int j=1;j<=n-i+1;j++)
    {
    int temp = i+j-1;
    dp[j][temp] = 1000000000;
    for(int k=j;k<=temp-1;k++)
    {
    v = dp[j][k]+dp[k+1][temp]+p[j-1]*p[k]*p[temp];
    if(v<dp[j][temp])
    {
    dp[j][temp] = v;
    s[j][temp] = k;
    }
    }
    }
    //cout<<dp[1][n]<<endl;
    cout<<"Case "<<counter<<": ";
    print(1,n);
    cout<<endl;
    }

    return 0;
    }

  • 相关阅读:
    js面向对象总结
    css3重点回顾字体
    URI和URL的区别
    nodejs 利用zip-local模块压缩文件夹
    vue cli3 vue.config.js 配置详情
    如何在TypeScript中使用第三方JavaScript框架
    代码简洁之道
    js判断一个图片是否已经存在于缓存
    png8、16、24、32位的区别
    实现前端路由
  • 原文地址:https://www.cnblogs.com/yejinru/p/2374711.html
Copyright © 2020-2023  润新知