给出一系列的1x2的矩阵,要你求出矩阵以什么样的次序相乘才使得相乘次数最少,。(不用排序,只要决定该矩阵是和前面相乘比较好,还是后面)。

今天仔细想了一下,跟之前做的DP题目做了下对比,你比如说猴子堆砖块拿香蕉那题,那种是通过设定局部量j,求得1到j的局部最优解,再递增j,直到求得全局最优解

这种题目,由于两两之间不同的顺序就能产生不同解,所以,是通过设定局部量j,求得相隔为j的两矩阵相乘的最优解,再递增j,直到全局。

一开始我的思路就局限在第一种,所以怎么想也没理清怎么写。

还有,这个题目输出比较麻烦,在DP过程中,用一个二维数组记录求得i到j之间最优解的时候,是哪个矩阵在前面。

通过递归的方式输出,好厉害,膜拜浙西贫农大神。

#include <iostream>
#include <cstdio>
using namespace std;
int dp[][];
int a[],b[];
int rec[][];
void print(int i,int j)
{
if (i==j){
cout<<"A"<<i;
return;
}
if (i<j){
cout<<"(";
print(i,rec[i][j]);
cout<<" x ";
print(rec[i][j]+,j);
cout<<")";
}
}
int main()
{
int n;
int cases=;
while (scanf("%d",&n)&&n){
int i,j,k;
for (i=;i<=n;i++){
scanf("%d %d",&a[i],&b[i]);
}
for (j=;j<=n;j++){
for (k=;k<=n;k++){
if (j==k) dp[j][k]=;
else
dp[j][k]=<<;
rec[j][k]=j;
}
}
int p;
for (p=;p<=n-;p++){
for (i=;i<=n-p;i++){
j=p+i;
int temp;
for (k=i;k<=j-;k++){
temp=dp[i][k]+dp[k+][j]+a[i]*b[k]*b[j];
if (temp<dp[i][j]){
dp[i][j]=temp;
rec[i][j]=k;
// cout<<"rec "<<i<<" "<<j<<" "<<k<<" "<<temp<<endl;
}
} }
}
cout<<"Case "<<cases<<": ";
cases++;
print(,n);
putchar('\n');
}
return ;
}

最新文章

  1. ArcGIS之Cartogram地图变形记
  2. python中遍历文件的3个方法
  3. 检测是否是IE浏览器
  4. 简单了解Hibernate核心API
  5. 如何调用super
  6. Ping 命令
  7. NPlot开源画图类
  8. Linux历史上线程的3种实现模型
  9. Centos 6修复/boot目录及fstab等系统文件
  10. arm-linux-gcc 4.3.2编译uboot 1.1.6
  11. JS的常用属性
  12. 使用顶级 VSCode 扩展来加快开发 JavaScript
  13. 输入参数的默认值设定${3:-var_d}
  14. angular2的ElementRef在组件中获取不到
  15. JavaScript定时器实现的原理分析
  16. python学习之第八篇——字典嵌套之字典中嵌套字典
  17. SCU 4437 Carries(二分乱搞)题解
  18. 《剑指offer》第四十七题(礼物的最大价值)
  19. CentOS7上安装RabbitMQ
  20. Mac下配置域名和网站测试环境

热门文章

  1. ConfigureDefender – Windows Defender 设置工具
  2. yolov3输出检测图片位置信息
  3. tab选项卡,不带自动切换定时器
  4. Oracle的操作经验
  5. C++面试常见问题——08const关键字
  6. 【转】R语言函数总结
  7. SpringBoot#JSR303
  8. .net core项目iis10上出现 HTTP 错误 500.19,错误代码:0x8007000d
  9. 实验吧-隐写术-黑与白(二)(反转+五笔+Image steganography)
  10. nosql的介绍以及和关系型数据库的区别