其他分享
首页 > 其他分享> > Saki也想要变强之Saki的一日一题(2)

Saki也想要变强之Saki的一日一题(2)

作者:互联网

day 2
题目:
用加括号的方式给出最优的矩阵相乘方案
输入:
多组数据输入
第一行一个整数 n,表示矩阵链的长度(1<=n<=300)
接下来一行n+1个数表示这些矩阵的行数和列数
别问我为什么只有n+1个数,每相邻的两个数表示一个矩阵的大小
输出:
对于每组数据,输出两行,第一行为计算次数,第二行为计算方案,用加括号的方式给出最优的矩阵相乘方案
如果不幸最优方案不唯一,选择优先计算左边的矩阵
代码:
include<stdio.h>
include<limits.h>
include<stdlib.h>
int a[1000],m[1000][1000],s[1000][1000];
int max(int a, int b){
if(a>b)
return a;
else return b;
}
void move(int i,int j){
if(i==j){
printf("A%d", i);
}
else{
printf("(");
move(i, s[i][j]);
move(s[i][j] + 1, j);
printf(")");
}
}
int main()
{
int n,i,l,j,k,temp;
while (~scanf("%d",&n)){
for (i = 0; i <= n;i++)
{
scanf("%d", &a[i]);
}
for (i = 1; i <= n;i++){
m[i][i] = 0;
}
for (l = 2; l <= n;l++){
for (i = 1; i <= n - l + 1;i++)
{
j = i + l - 1;
m[i][j] = INT_MAX;
for (k = i; k <= j - 1;k++){
temp = m[i][k] + m[k + 1][j] + a[i - 1] * a[k]*a[j];
if(temp<m[i][j]){
m[i][j] = temp;
s[i][j] = k;
}
}
}
}
printf("%d\n", m[1][n]);
move(1, n);
printf("\n");
}
}
心得明天~~

标签:Saki,temp,int,move,矩阵,变强,printf,想要,1000
来源: https://www.cnblogs.com/sakisaki/p/13899751.html