简单区间DP

news2024/11/16 9:22:17

文章目录

  • 什么是区间Dp
  • AcWing 282. 石子合并
    • 题意分析
    • 思路解析
      • 状态表示
      • 状态计算
    • CODE
    • 需要注意的问题



什么是区间Dp

区间Dp指的是某些问题可以用区间来划分解决。


AcWing 282. 石子合并

题目链接:穿梭时间的画面的钟
在这里插入图片描述


题意分析

从一排石子中选择相邻的两堆进行合并,要求两堆之和最小。


思路解析

在这里插入图片描述

状态表示

二维状态表示,分别表示左右端点,也就是划分出了一个区间 [ i , j ] [i, j] [i,j],代表的集合就是在这个区间里合并石子的代价,属性则是取最小值。

状态计算

最重要的是状态计算:如何对区间的最小代价进行计算呢?

我们将问题往回退一步:我们最终是对两堆石子进行合并,这个代价是死的,就是区间内所有石子的重量和。我们设两堆石子的分解点是 k k k,那么问题又来了,怎么确定 k k k 在哪?我们从头往后遍历,找 [ l , k ] [l, k] [l,k] [ k + 1 , r ] [k + 1, r] [k+1,r]的最小代价,怎么找?再往后退一步:……
最后我们可以发现,我们只需要拆解第一步,Dp就会自动往后递归,帮我们找到想要的结果。


CODE

#include <iostream>  
#include <cstring>  
#include <algorithm>  
  
using namespace std;  
  
const int N = 3e5 + 10; // 定义常量N,表示数组的最大长度  
int a[N], s[N]; // 定义整数数组a和前缀和数组s  
int f[N][N]; // 定义二维数组f,用于动态规划计算最大和  
  
int main() // 主函数开始  
{  
    int n; // 定义整数n,表示接下来要输入的整数的数量  
    scanf("%d", &n); // 读取整数n  
  
    for(int i = 1; i <= n; ++i) // 循环读取n个整数并存储在数组a中  
    {  
        scanf("%d", &a[i]);  
        s[i] = s[i - 1] + a[i]; // 计算前缀和数组s  
    }  
  
    for(int len = 1; len <= n; ++len) // 循环计算不同长度的子数组的最大和  
    {  
        for(int i = 1; i + len - 1 <= n; ++i) // 内层循环遍历所有可能的起始位置i  
        {  
            int l = i, r = l + len - 1; // 定义左边界l和右边界r  
            for(int k = l; k <= r; ++k) // 对于每个k,计算f[l][r]的值  
            {  
            	// 更新f[l][r]的值
                f[l][r] = min(f[l][r], f[l][k] + f[k][r] + s[r] - s[l]);   
            }  
        }  
    }  
  
    cout << f[1][n] << endl; // 输出整个数组中的最大和  
  
    return 0; // 主函数结束,返回0表示程序正常结束  
}



枚举左右端点,但是左端点要从最后一个开始枚举
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 330, INF = 0x3f3f3f3f;

int a[N], s[N];
int f[N][N];

int main(){
    int n;
    scanf("%d", &n);

    for (int i = 1; i <= n; i ++ ){
        scanf("%d", &a[i]);
        s[i] = s[i - 1] + a[i];
    }

    for(int i = n; i >= 1; --i)
        for(int j = i + 1; j <= n; ++j){
            if(i == j){
                f[i][j] = 0;
                continue;
            }

            f[i][j] = INF;
            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] << endl;
}

需要注意的问题

  • 枚举区间长度时,从 2 2 2 开始枚举,因为后面有一句f[i][j] = INF,如果从 1 1 1 开始的话就会将f[i][i]这个区间设为INF了,这个区间意味着自己到自己需要合并的最小代价,但是只有一堆,所以是不需要合并的,也就是 0 0 0,那么这么做就错了。
  • 枚举左右端点时要从后往前枚举,因为答案是f[1][n],而我们从第一堆开始枚举的时候会导致后面的最小代价全都是 0 0 0,在过了f[1]时才会从默认的 0 0 0 更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024-01-25 力扣高频SQL50题目1193每月交易

1.1193每月交易 1 count可以这样用。。 COUNT(IF(state approved, 1, NULL)) AS approved_count 如果 COUNT(if(state approved,1,0))&#xff0c;这里变成0&#xff0c;就不对了。因为count计数时候&#xff0c;只要里面不是null&#xff0c;就会算进去。 sum(if(state …

(学习日记)2024.01.27

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

行为型设计模式—迭代器模式

迭代器模式&#xff1a;也叫作游标模式&#xff0c;能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。在迭代器的帮助下&#xff0c; 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。 当集合背后为复杂的数据结构&#xff0c;且希望对客户端隐藏其复…

漏洞原理文件上传漏洞

一 文件上传漏洞介绍&#xff08;理论&#xff09; 文件上传漏洞是一种常见的web应用程序漏洞&#xff0c;允许攻击者向服务器上传恶意文件。这种漏洞可在没有恰当的安全措施的情况下&#xff0c;将任意类型的文件上传到服务器上&#xff0c;从而可能导致以下安全问题&#xff…

【lesson1】高并发内存池项目介绍

文章目录 这个项目做的是什么&#xff1f;这个项目的要求的知识储备和难度&#xff1f;什么是内存池池化技术内存池内存池主要解决的问题malloc 这个项目做的是什么&#xff1f; 当前项目是实现一个高并发的内存池&#xff0c;他的原型是google的一个开源项目tcmalloc&#xf…

Python 字典及常见应用(Python Dctionary)

字典是python的内置基本数据类型之一&#xff0c;其他语言中可能会被称为“关联存储”或“关联数组”。它是一种映射关系&#xff0c;以包含在{}中的"键:值"对表示。字典是一种可变对象&#xff0c;键没有顺序。其主要用途是通过关键字存储、提取值。 目录 一、字典的…

3分钟搞定幻兽帕鲁联机,一键部署专属服务器

3分钟搞定幻兽帕鲁联机&#xff0c;一键部署专属服务器 访问帕鲁专题活动页 登录阿里云官网&#xff0c;用钉钉或者支付宝app扫码注册新用户&#xff08;新用户福利较多&#xff0c;优惠力度大&#xff09; 进入阿里云游戏联机服务器专题页&#xff0c;点击 一键购买及部署 即可…

记录一条sql查询:以逗号隔开的id字符串的查询

目录 前言表结构sql语句 前言 在一个项目中有两张表&#xff0c;一张是商品码表&#xff0c;一张是记录出库单明细的出库记录表&#xff0c;记录表中有一个字段保存了以逗号隔开的商品码表的id字符串&#xff0c;需要根据出库明细id查找到对应出库的商品码。 表结构 goods_det…

TypeScript(六) 循环语句

1. TypeScript循环语句 1.1. 简述 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。   循环语句允许我们多次执行一个语句或语句组…

【开源】JAVA+Vue.js实现大学兼职教师管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0c;旨…

阿里云0基础1分钟搞定幻兽帕鲁游戏联机服务器搭建

幻兽帕鲁&#xff08;Palworld&#xff09;是一款备受欢迎的多人在线角色扮演游戏&#xff0c;让玩家可以与其他玩家一起探索、组队和战斗。为了能顺畅地体验游戏&#xff0c;搭建一个高效、稳定的游戏服务器至关重要。阿里云提供快速、简化的服务器搭建方案&#xff0c;新手小…

代码随想录 Leetcode112. 路径总和

题目&#xff1a; 代码(首刷看解析 2024年1月30日 递归回溯 逻辑清晰版&#xff09;&#xff1a; class Solution { public:bool traversal(TreeNode* cur,int sum) {if (!cur->left && !cur->right && sum 0) return true;if (!cur->left &&am…

iOS 17.4 苹果公司正在加倍投入人工智能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

开发AI软件,构建多用户AIGC系统,实现图文创作及源码交付

在AI技术不断进步的今天&#xff0c;AI软件开发已成为一个热门的领域。而多用户AIGC系统作为AI软件开发的重要项目之一&#xff0c;呈现出极大的潜力和前景。 多用户AIGC系统旨在为用户提供一个全面的图文创作平台&#xff0c;借助AI的力量&#xff0c;使创作过程更加智能化和…

代码随想录算法训练营DAY7 | 哈希表(2)

一、LeetCode 454 四数相加II 题目链接&#xff1a;454.四数相加IIhttps://leetcode.cn/problems/4sum-ii/description/ 思路&#xff1a;建立HashMap&#xff0c;Key存储nums1、nums2数对之和&#xff0c;Value存储数对和出现次数&#xff0c;再遍历nums3、nums4数对确定答案…

研学活动报名平台源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 研学活动报名平台旨在为活动组织者提供方便快捷的研学活动管理工具&#xff0c;同时为用户提供全面的活动搜索、报名和支付等功能。通过该系统&#xff0c;活动组织者能够更好地管理活动报名信息&#xff0c;用户也可…

【Lazy ORM 整合druid 实现mysql监控】

Lazy ORM 整合druid 实现mysql监控 JDK 17 Lazy ORM框架地址 up、up欢迎start、issues 当前项目案例地址 框架版本描述spring-boot3.0.7springboot框架wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器Lazy -ORM1.2.2-JDK17-SNAPSHOTORMmysql-connector-j8.0.33mysql驱动druid-…

自动化测试接口测试前的【准备及思路】

1、什么是接口测试 客户端&#xff08;前端&#xff09;与服务端&#xff08;后端&#xff09;的关系&#xff0c;一般小编会理解为“服务端负责赚钱养家&#xff0c;客户端负责貌美如花”。客户端更注重的是功能呈现及用户体验&#xff0c;怎么将强大的功能精彩的界面呈现给不…

代码随想录算法训练营第35天 | 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球

柠檬水找零 局部最优&#xff1a;收到20元时优先找零10元5元&#xff0c;不够再找零3个5元&#xff0c;因为5元可以找零20和10&#xff0c;更有用。全局最优&#xff1a;完成所有的找零。 class Solution { public:bool lemonadeChange(vector<int>& bills) {int fi…

84 C++对象模型探索。数据语义学 - 继承多个类的时的数据布局问题。

此章节分析多继承问题&#xff0c;难点&#xff0c;但是非重点&#xff0c;实际开发中&#xff0c;多继承用的很少&#xff0c;容易被code review&#xff0c;可以不看。 我们要访问一个类对象中的成员 成员的定位是通过如下两个因素决定的&#xff1a;this指针(编译器会自动调…