首页 > 其他分享 >区间dp入门

区间dp入门

时间:2024-07-21 23:40:52浏览次数:7  
标签:10 arr 入门 int 石子 vector 区间 dp

[NOI1995] 石子合并

题目描述

在一个圆形操场的四周摆放 \(N\) 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 \(2\) 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出一个算法,计算出将 \(N\) 堆石子合并成 \(1\) 堆的最小得分和最大得分。

输入格式

数据的第 \(1\) 行是正整数 \(N\),表示有 \(N\) 堆石子。

第 \(2\) 行有 \(N\) 个整数,第 \(i\) 个整数 \(a_i\) 表示第 \(i\) 堆石子的个数。

输出格式

输出共 \(2\) 行,第 \(1\) 行为最小得分,第 \(2\) 行为最大得分。

样例 #1

样例输入 #1

4
4 5 9 4

样例输出 #1

43
54

提示

\(1\leq N\leq 100\),\(0\leq a_i\leq 20\)。

AC code:

#include <bits/stdc++.h>
#define print(x) cout << #x << '=' << x << '\n'
using namespace std;
using i64 = long long;
i64 max(i64 a,i64 b)
{
    return a>b?a:b;
}
i64 min(i64 a,i64 b)
{
    return a<b?a:b;
}
void find(vector<i64> &arr, int n)
{
    vector<i64> sum(2 * n + 10, 0);
    vector<vector<i64>> dp(2 * n + 10, vector<i64>(2 * n + 1, 0x7fffffff));
    vector<vector<i64>> dp2(2 * n + 10, vector<i64>(2 * n + 1, -0x7fffffff));

    for (int i = 1; i < 2 * n; i++)
    {
        dp2[i][i] =0; dp[i][i] = 0;
        sum[i] = sum[i - 1] + arr[i];
    }
    for (int len = 2; len <= n; len++)
    {
        for (int i = 1; i+len-1 <= 2*n; i++)
        {
            // 区间起点
            int j = i + len - 1;
            // 终点
            for (int k = i; k < j; k++)
            {
                dp2[i][j] = max(dp2[i][j], dp2[i][k] + dp2[k + 1][j] + sum[j] - sum[i - 1]);
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
            }
        }
    }
    i64 _min = 0x7fffffff;
    i64 _max=-1;
    for (int i = 1; i <= n; i++)
    {
        _max = max(dp2[i][i + n - 1],_max);
        _min = min(dp[i][i + n - 1], _min);
    }
    std::cout << _min << '\n';
    std::cout << _max <<'\n';
}
int main()
{

    int n;
    std::cin >> n;
    vector<i64> arr(2 * n + 10,0);
    for (int i = 1; i <= n; i++)
    {
        std::cin >> arr[i];
        arr[i + n] = arr[i];
    }
    find(arr, n); // 查找最大值不能用贪心,这也得用区间dp
    return 0;
}

标签:10,arr,入门,int,石子,vector,区间,dp
From: https://www.cnblogs.com/cxjy0322/p/18315154

相关文章

  • 【普及动规】dp例题精讲+强化练习
    本篇给大家带来一些好的dp题,大家可以学习一下。找找感觉。dp这种东西主要还是靠分类总结+感觉。多练习永远不错。T1.害羞的xxx题面:(由于某些原因无法公开原题,请见谅)题目背景保护好xxx,因为他随时会害羞。题目描述众所周知,xxx非常害羞。可是学校最近在选拔芭蕾舞演员......
  • 【CTF入门】BUUCTF Web刷题
    【CTF入门】BUUCTFWeb刷题[极客大挑战2019]EasySQL打开网站,我们看到这个页面:又是SQL注入,做吐了,按思路来能输入的地方都是注入点,我们尝试注入:获得flag考点:SQL注入[极客大挑战2019]Havefun打开网站,我们看到这个页面:我们看不出什么信息,首先观察一下网站的源码,我们在底......
  • IMGUI快速入门
    资源大全官方资源源码+例子:ocornut/imgui:DearImGui:Bloat-freeGraphicalUserinterfaceforC++withminimaldependencies(github.com)python绑定:pyimgui/pyimgui:Cython-basedPythonbindingsfordearimgui(github.com)调试IMGUI自身:调试工具·ocornut/imgui......
  • 【深度学习入门项目】多层感知器(MLP)实现手写数字识别
    多层感知器(MLP)实现手写数字识别导入必要的包获得软件包的版本信息下载并可视化数据查看一个batch的数据查看图片细节信息设置随机种子定义模型架构Buildmodel_1Buildmodel_2TraintheNetwork(30marks)Trainmodel_1Trainmodel_1Visualizethetrainingprocess......
  • java入门—JDK下载、环境配置、IDEA开发工具使用
    JavaSE入门—初识Java、JDK开发环境下载、Path环境配置、IDEA开发工具下载、HelloWorld详解1.Java概述1.1Java发展概述1.2Java语言特点及应用1.3Java技术体系2.Java的开发环境(JDK)搭建2.1JDK的下载2.2JDK与JRE3.Java环境配置3.1path、JAVA_HOME环境变量配......
  • DDP
    线段树+树剖/\(lct\)维护广义矩阵乘法从例题开始讲P4719如果不带修改,那么就好做了\(f_{i,1/0}\)表示\(i\)节点选或不选的最大权容易得到转移\[ f_{i,0}=\sum_{son}max(f_{son,0},f_{son,1})\]\[ f_{i,1}=w_i+\sum_{son}f_{son,0}\]但是现在带修。你会......
  • Microsoft Endpoint Manager(MEM)是微软的一体化端点管理平台,结合了Microsoft Intune和C
    MicrosoftEndpointManager(MEM)是微软的一体化端点管理平台,结合了MicrosoftIntune和ConfigurationManager(SCCM),为企业提供跨设备、跨平台的终端管理和安全性管理能力。主要特点和功能包括:统一管理控制台:MEM提供了统一的管理控制台,使IT管理员可以从一个地方管理和监控企业中的......
  • MySQL入门学习-SQL高级技巧.透视表
        在MySQL中,虽然没有直接提供像Excel中那样的透视表功能,但可以通过一些技巧来实现类似的效果。通常,我们可以使用聚合函数和'GROUPBY' 子句来创建数据的透视表。一、透视表的概念:    透视表是一种数据汇总和分析的工具,它可以将数据按照不同的维度进行......
  • MySQL入门学习-SQL高级技巧.Window Function
        在MySQL中,窗口函数(WindowFunction)是一种强大的分析工具,它可以在查询结果的基础上进行更复杂的计算和分析。一、窗口函数的概念:    窗口函数可以对查询结果的每一行数据,根据指定的分区(Partition)和排序规则(Order)进行计算。它可以在同一查询中同时返回基础......
  • Redis入门介绍
    目录Redis简介​编辑Redis下载与安装Redis服务启动与停止Redis数据类型字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令在Java中操作RedisRedis的Java客户端SpringDataRedis使用方式 Redis简介Redis是一个基于内存的key-va......