解题思路:





注意事项:





参考代码:


啦啦啦啦,我又回来啦!!!!

#include <cstdio>
#include <cstring>

struct NODE
{
    int score;
    int rft[31];

    inline NODE()
    {
        score = 1;
        rft[0] = 0;
    }

    inline NODE (const int& score, const int& no)
    {
        this->score = score;
        rft[0] = 1;
        rft[1] = no;
    }
} f[32][32];

int n;

inline NODE merge(const NODE& left, const NODE& root, const NODE& right)
{
    NODE dst(root.score, root.rft[1]);

    dst.score += left.score*right.score;
    dst.rft[0] += left.rft[0] + right.rft[0];
    memcpy(dst.rft + 2, left.rft + 1, left.rft[0]*4);
    memcpy(dst.rft + 2 + left.rft[0], right.rft + 1, right.rft[0]*4);

    return dst;
}

inline NODE max(const NODE& a, const NODE& b)
{
    return a.score > b.score ? a : b;
}

int main()
{
    scanf("%d", &n);
    for (int i = 1, t; i <= n; i++)
    {
        scanf("%d", &t);
        f[i][i] = NODE(t, i);
    }

    for (int l = 2; l <= n; l++)
        for (int i = 1; i <= n - l + 1; i++)
            for (int j = 0; j < l - 1; j++)
                f[i][i + l - 1] = max(f[i][i + l - 1], merge(f[i][i + j - 1], f[i + j][i + j], f[i + j + 1][i + l - 1]));

    printf("%d\n", f[1][n].score);
    for (int i = 1; i <= f[1][n].rft[0]; i++)
        printf("%d ", f[1][n].rft[i]);

    return 0;
}

点赞!!!!!


点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论