【石子合并】

题目

错解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 310;
int a[N], s[N], f[N][N];
int main()
{
    int n;
    cin >> n;
    memset(f, 0x3f, sizeof f);
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        s[i] = s[i-1] + a[i];
        f[i][i] = 0;
    }
    for(int i = 1; i < n; i++)
    {
        for(int j = i+1; j <= n; j++)
        {
            for(int k = i; k < j; k++)
            {
                f[i][j] = min(f[i][j], f[i][k] + f[k+1][j] + s[j] - s[i-1]);
            }
        }
    }
    cout << f[1][n];
}

分析

应该从小区间遍历到大区间。因为这个更新方向是从小到大(先整合一小部分,再整合大部分),而不是从左到右、从上往下。

正解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 310;
int a[N], s[N], f[N][N];
int main()
{
    int n;
    cin >> n;
    memset(f, 0x3f, sizeof f);
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        s[i] = s[i-1] + a[i];
        f[i][i] = 0;
    }
    for(int len = 2; len <= n; len++)
    {
        for(int i = 1; i + len -1 <= n; i++)
        {
            int j = i + len - 1;
            for(int k = i; k < j; k++)
            {
                f[i][j] = min(f[i][j], f[i][k] + f[k+1][j] + s[j] - s[i-1]);
            }
        }
    }
    cout << f[1][n];
    return 0;
}
相关推荐
zhouwy1131 小时前
Linux文件系统与IO编程
linux·c++
深邃-2 小时前
【数据结构与算法】-二叉树(2):实现顺序结构二叉树(堆的实现),向上调整算法,向下调整算法,堆排序,TOP-K问题
数据结构·算法·二叉树·排序算法·堆排序··top-k
We་ct5 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮9 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说9 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove10 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung11 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了11 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL11 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化