求助一道站外题
  • 板块灌水区
  • 楼主Jesusdalao
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/4 18:43
  • 上次更新2023/10/27 17:01:19
查看原帖
求助一道站外题
701230
Jesusdalao楼主2022/8/4 18:43

题面:

题目描述

给定 n个矩阵{A1,A2,...,An},考察这 n个矩阵的连乘积 A1A2...An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。
矩阵连乘积的计算次序与其计算量有密切关系。例如,考察计算 3 个矩阵{A1,A2,A3}连乘积的例子。 设这3个矩阵的维数分别为10*100, 100*5,和5*50。

若按(A1A2)A3 计算,3 个矩阵连乘积需要的数乘次数为 10*100*5+10*5*50 = 7500。

若按 A1(A2A3)计算,则总共需要100*5*50+10*100*50 = 75000次数乘。

现在你的任务是给出一个矩阵连乘式,计算其需要的最少乘法次数。
输入格式
输入数据由多组数据组成。每组数据格式如下: 第一行是一个整数n (1≤n≤100),表示矩阵的个数。 接下来 n 行,每行两个整数 a,b,分别表示该矩阵的行数和列数,其中1<a,b<100。
输出格式
对于每组数据,输出仅一行包含一个整数,即将该矩阵连乘方案需要的最少乘法次数。
样例

输入
3 
10 100 
100 5 
5 50

输出
7500

我的代码:

#include <bits/stdc++.h>
using namespace std;
long long a[1010],dp[1010][1010];
int kkk;
long long x,y;
long long s(int n){
    long long sum;
    for(int len=2;len<=n;len++){
        int j=len;
        for(int i=1;i<=n,j<=n;i++,j++){
            long long minn=1e18;
            for(int k=i;k<j;k++){
                minn=min(minn,dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]);
                dp[i][j]=minn;
            }
        }
    }
    return dp[1][n];
}
int main() { 
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
   		cin>>x>>y;
   		if(i==1) a[kkk]=x;
   		else if(i==n) a[kkk]=y;
   		else{
   			a[kkk]=x;
   			kkk++;
   			a[kkk]=y;
		}
		kkk++;
	}
	cout<<s(kkk)<<endl;
	return 0;
}

不知为何输出的都是0 求解

2022/8/4 18:43
加载中...