码迷,mamicode.com
首页 > 其他好文 > 详细

hlg1600线性代数中的矩阵问题【区间dp】

时间:2014-09-19 21:06:26      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   div   

大意:

告诉你n个矩阵的行数和列数

比如说

3

2 3 4 5

代表有3个矩阵第一个矩阵2 * 3  第二个矩阵 3 * 4 第三个矩阵4 * 5  

并且知道只有连续的矩阵才可以相乘

问最后相乘的次数最少是多少

 

分析:

用区间dp可以做

每次递归调用的时候枚举每个分割点

最后加上附带的价值即可

 

代码:

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int maxn = 105;
 7 const int INF = 1000000000;
 8 
 9 int dp[maxn][maxn];
10 int a[maxn];
11 
12 int ddp(int i, int j) {
13     if(dp[i][j] != -1) return dp[i][j];
14     if(i + 1 == j) {
15         return  dp[i][j] = 0;
16     }
17     int Min = INF;
18     for(int k = i + 1; k < j; k++) {
19         Min = min(Min , ddp(i, k) + ddp(k, j) + a[i] * a[k] * a[j]);
20     }
21     return dp[i][j] = Min;
22 }
23 
24 int main() {
25     int t;
26     int n;
27     scanf("%d",&t);
28     while(t--) {
29         scanf("%d",&n);
30         for(int i = 1; i <= n + 1; i++) {
31             scanf("%d",&a[i]);
32         }
33         if(n == 1) {
34             puts("0");
35             continue;
36         }
37         memset(dp, -1, sizeof(dp));
38         printf("%d\n", ddp(1, n + 1));
39 //        for(int i = 1; i <= n + 1; i++) {
40 //            for(int j =1; j <= n + 1; j++) {
41 //                printf("%d %d %d\n", i, j, dp[i][j]);
42 //            }
43 
44     }
45     return 0;
46 }
View Code

 

hlg1600线性代数中的矩阵问题【区间dp】

标签:style   blog   http   color   io   os   ar   for   div   

原文地址:http://www.cnblogs.com/zhanzhao/p/3982247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!