UVa 348 Optimal Array Multiplication Sequence:区间DP&矩阵链乘,MCM

348 - Optimal Array Multiplication Sequence

Time limit: 3.000 seconds

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=284

记忆化搜索:dp[a][b] = max(dp[a][b], dp[a][i] + dp[i + 1][b] + x[a] * y[i] * y[b])

完整代码:

/*0.089s*/

#include <cstdio>
#include <cstring>
const int MAXN = 15;  

int x[MAXN], y[MAXN], d[MAXN][MAXN], path[MAXN][MAXN];  

int dp(int a, int b)
{
    if (d[a][b] >= 0) return d[a][b];
    path[a][b] = a;
    if (a == b) return d[a][b] = 0;
    d[a][b] = -1u >> 1;
    int tmp;
    for (int i = a; i < b; ++i)
    {
        tmp = dp(a, i) + dp(i + 1, b) + x[a] * y[i] * y[b];
        if (tmp < d[a][b])
            d[a][b] = tmp, path[a][b] = i;
    }
    return d[a][b];
}  

void print(int a, int b)
{
    if (a > b) return;
    if (a == b) printf("A%d", a + 1);
    else
    {
        printf("(");
        print(a, path[a][b]);
        printf(" x ");
        print(path[a][b] + 1, b);
        printf(")");
    }
}  

int main()
{
    int n, cas = 0;
    while (scanf("%d", &n), n)
    {
        memset(d, -1, sizeof(d));
        for (int i = 0; i < n; i++)
            scanf("%d%d", &x[i], &y[i]);
        dp(0, n - 1);
        printf("Case %d: ", ++cas);
        print(0, n - 1);
        putchar(10);
    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索dp
, int
, printf
, path
, return
print
multiplication、multiplication table、multiplication rule、cross multiplication、long multiplication,以便于您获取更多的相关知识。

时间: 2024-09-20 18:48:32

UVa 348 Optimal Array Multiplication Sequence:区间DP&amp;矩阵链乘,MCM的相关文章

算法题:UVA 348 Optimal Array Multiplication Sequence(区间dp)

Optimal Array Multiplication Sequence Given two arrays A and B, we can determine the array C = A B using the standard definition of matrix multiplication: The number of columns in the A array must be the same as the number of rows in the B array. Not

UVAoj 348 - Optimal Array Multiplication Sequence

/* 题意:矩阵相乘的最少的步数 dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j]); 表示的是第i个矩阵到第j个矩阵相乘的最少步数 sign[i][j]表示的是第i个矩阵到第j个矩阵相乘的最少步数是由第i个矩阵到第sign[i][j]个矩阵相乘最少步数 和第sign[i][j]+1个矩阵到第j个矩阵相乘最少步数的得到的最小值! */ #include<iostream> #include<cstring&

uva 10688:The Poor Giant(区间dp)

题目链接: uva-10688 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=514&page=show_problem&problem=1629 题意 有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的, 所有比它重量轻的都是苦的,比它重的都是酸的. 为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果

算法:uva-10304 Optimal Binary Search Tree(区间dp)

题意 给一个序列即可 S = (e1,e2,...,en),且e1<e2<..<en.要把这些序列构成一个二叉搜索 树. 二叉搜索树是具有递归性质的,且若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 值: 若它 的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 因为在实际应用中,被访 问频率越高的元素,就应该越接近根节点,这样才能更加节省查找时间. 每个元素有一个访问频率f(ei) ,当元素位于深度为k的地方,那么花费cost(ei) = k. 所有节点的花费和访问

算法:uva 10003 Cutting Sticks (区间dp)

题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一定顺 序把每个点都砍段,最后变成了n+1段 每砍一次,就会有一个花费,例如长度为10,"切点"为2,那么砍完 后会变成两段2,8, 那么花费为2+8=10 如果有多个"切点",那么不同顺序切会得到不同的花费. 最小 花费是多少? 思路 注意要增加一个c[n] = l f(i, j) 表示(i,j)区间的最小花费 f(i, j) = min{ f(i,k)+f(k+1,

算法:uva 1351 String Compression(字符串区间dp)

题目大意 给一个字符串,可以把连续相同的部分进行缩写成k(S)的形式,S是一个字符串,k表示 有连续相同的S 例如,abgogogogo,可以缩写成ab4(go). 还可以嵌套缩写,比如 "nowletsgogogoletsgogogo", 缩写成"now2(lets3(go))" 思路 一道区间dp,但是这题并 不好想 f(i, j)表示字符串的i~j位的最小位数 那么 f(i, j) = min{  min{ f(i,k)+f(k+1, j), i<=k&

算法:hdu 4597 Play Game(区间dp)

题意 Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个 只能从其中一个序 列,选择两端中的一个拿走.他们都希望可以拿到尽量大 的数字之和,并且他们都足够聪明,每次都选择 最优策略.Alice先选择,问 最终Alice拿到的数字总和是多少? 思路 这题应该算是区间dp吧, 可以看一下这题的原型: 其他规则都一样,但是只有一个数字序列,也是每次只能拿左右两端的一个数字 ,问最终Alice拿多少? (这个可以去做uva-10891) 只有一行数字序列可以用f(i, j)表示数

UVA 10405 Longest Common Subsequence:简单DP

省赛还有不到50天了,自己DP这块实在是弱,准备就拿着些天狂刷DP了. http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1346 大意: 求两个字符串的最长公共子序列. 思路:水题,不过需要注意的就是字符串里可能会出现空格,需要用gets,真是坑. 更多精彩内容:http://www.bianceng.cnhttp://www.biancen

UVa 437 The Tower of Babylon:DP&amp;amp;DAG

437 - The Tower of Babylon Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=378 思路: 对于一个(x,y,z)砖头,它可以有3中姿势放置: (前两个为地面,后一个为高) x, y, z x, z, y y, z, x 把每种姿势