木棍分割-dp,前缀和优化

news/2025/11/26 20:32:09/文章来源:https://www.cnblogs.com/jiu-wei-lwj/p/19274589

木棍分割-dp,前缀和优化

P2511 木棍分割

题意

\(n\) 根木棍,给出长度,要分成 \(m\) 段,问总长度最大的一段最小长度是多少,并求出其方案数对 \(10007\) 取模的结果。

思路

第一问很容易想到用二分,第二问也比较容易想到用 \(dp\) 。二分怎么做这里不做赘述。

考虑 \(dp\) ,我们要满足长度最小,且分出来的段数小于 \(m+1\) ,很容易设计出一维给段数,一维放长度不合适,但是可以存已经做到哪里,也就是 \(dp[i][j]\) 表示到 \(i\) 分出 \(j\) 块的方案数。

状态转移:

\[dp_{i,j} = \sum_{len_j-len_k \leq milen} dp_{i-1,k} \]

此时两层枚举加上找 \(k\) 时间复杂度 \(O(n^3)\) ,发现找 \(k\) 可以用前缀和优化,而且长度只会递增所以我们可以预处理出每个点的 \(k\) 。空间还要压一下。

code

#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int maxn = 5e4+10;
constexpr int mod = 1e4+7;
void read(int &);int n,m;
int li[maxn];
int dp[maxn],sum[maxn],st[maxn];
int sumdp[maxn];// 对对应dp作前缀和inline void add(int &x,const int y)
{x+=y;if(x>=mod){x-=mod;}else if(x<0){x+=mod;}
}bool check(int x)
{int cnt=1,len=0;for(int i=1;i<=n;++i){if(li[i]>x) return 0;if(len+li[i]>x){++cnt;len=li[i];}else{len+=li[i];}if(cnt>m){return 0;}}return 1;
}int binary(int l,int r)
{int mid,ans=0;while(l<=r){mid=l+((r-l)>>1);if(check(mid)){ans=mid;r=mid-1;}else{l=mid+1;}}return ans;
}int _dp(int x)
{for(int i=1,id=1;i<=n;++i)// 预处理k{if(sum[i]<=x){dp[i]=1;// dp[i][1]}while(id<=n && sum[i]-sum[id]>x){++id;}st[i]=id;}for(int i=1;i<=n;++i)// dp[i]的前缀和{add(sumdp[i],sumdp[i-1]+dp[i]);}int ret=0;for(int i=2;i<=m+1;++i){for(int j=1;j<=n;++j){dp[j]=sumdp[j-1];// 上一个dp的综合if(st[j]-1>=0)   // 存在{add(dp[j],-sumdp[st[j]-1]);// 减去dp_lst[st-1]}}for(int j=1;j<=n;++j){sumdp[j]=0;//前缀和add(sumdp[j],sumdp[j-1]+dp[j]);}add(ret,dp[n]);}return ret;
}signed main()
{#ifndef ONLINE_JUDGEfreopen("cjdl.in","r",stdin);freopen("cjdl.out","w",stdout);#endif // ONLINE_JUDGEread(n);read(m);for(int i=1;i<=n;++i){read(li[i]);sum[i]=sum[i-1]+li[i];}int len=binary(1,sum[n]);printf("%lld ",len);int ans=_dp(len);printf("%lld\n",ans);return 0;
}inline void read(int &x)
{x=0;int f=1;signed c=getchar();while(!isdigit(c)){if(c=='-'){f=-1;}c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x*=f;
}

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

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

相关文章

yolo入门的一些环境配置记录

anaconda # 查看 Conda 版本:conda --version# 更新 Conda 到最新版本:conda update conda# 设置国内镜像以加速安装: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ con…

LLM提示注入攻击深度解析:从原理到防御的完整应对方案

如果你再维护线上的聊天系统,那么提示注入(Prompt Injection)是绕不开的话题。这不是一个普通漏洞而是OWASP LLM Top 10榜单上的头号风险,它的影响范围覆盖所有部署大语言模型的组织。 本文会详细介绍什么是提示注入…

Go语言的应用场景有哪些?

Go 语言(Golang)凭借其高并发支持、简洁语法、高效编译和部署便捷性,在多个领域展现出强大优势,以下是其主要应用场景及典型案例: 1. 后端服务与微服务架构核心优势:原生并发模型(Goroutine+Channel)、高性能、…

Ceres Solver优化库学习笔记

1. Ceres Solver 1.1 简介定位:一个功能强大、通用的非线性最小二乘问题求解器。 哲学:提供一套丰富的API,让用户能够轻松地定义和构建残差项,并自动或手动指定微分方式,最终求解这些残差的平方和的最小值。它更像…

Flash动画制作总结

对于下周要进行验收的Flash动画大作业,我一开始并没有接触过这个,在进行询问AI和这个项目制作的步骤 从一开始的,AI建议使用HTML,因为现在大部分主流的浏览器已经不适配Flash插件了,导致一开始没有思路 后来在进行…

什么是Go语言

Go 语言(也称为 Golang)是由 Google 公司开发的静态类型、编译型编程语言,于 2009 年正式发布。它由 Robert Griesemer、Rob Pike 和 Ken Thompson(C 语言创始人之一)主导设计,旨在解决大型软件工程中的效率、复…

人工智能之数据分析 Matplotlib:第一章 简介和安装

人工智能之数据分析 Matplotlib:第一章 简介和安装人工智能之数据分析 Matplotlib 第一章 简介和安装@目录人工智能之数据分析 Matplotlib前言一、Matplotlib 简介二、安装 Matplotlib1. 使用 pip 安装(推荐)2. 使…

在C#中操作Word文档时,如何处理表格中的数据?

在 C# 中操作 Word 表格数据时,需结合使用的库(如Microsoft.Office.Interop.Word或DocX)进行数据填充、读取、修改、验证等操作。以下分场景详细说明处理方法: 一、数据填充(写入表格) 1. 使用 Interop.Word 填充…

第四十九篇

今天是11月26号,上了离散,两节马原

如何使用DocX库在C#中创建和格式化Word表格?

使用 DocX 库在 C# 中创建和格式化 Word 表格无需安装 Microsoft Office,且操作轻量、跨平台。以下是详细的实现步骤、示例代码及关键格式化技巧: 一、准备工作:安装 DocX 库 通过 NuGet 包管理器安装 DocX(由 Xce…

feature map是什么

特征图(Feature Map) 是卷积神经网络(CNN)对输入图像进行特征提取后得到的中间表示,可以理解为一组压缩但语义丰富的“特征图像”。在目标检测中,它是连接主干网络与检测头的核心桥梁。 一、直观形象:特征图长什…

10-数据格式转换

WKT数据格式处理 概述 WKT(Well-Known Text)是一种用于表示几何对象的标准文本格式。作为一种通用的几何数据表示方法,WKT可以作为不同GIS数据格式之间转换的桥梁。本章介绍WKT格式的特点、使用方法以及基于WKT进行…

elasticsearch创建用户、角色

我们要创建一个叫xjw的用户,这个用户要有较高的es权限和kibana权限,同时实现多用户下的数据隔离先创建角色 indices下的names属性里配置的是我们能操作的索引、模版等等数据的前缀“xjw-”,如果不带这个前缀会报错4…

09-国土TXT格式

国土TXT格式 概述 国土TXT格式是中国自然资源部门使用的地块坐标文本格式,主要用于土地调查、不动产登记等业务场景。理解并正确处理该格式是从事国土相关GIS开发的必备技能。 文件格式 基本结构 国土TXT文件由多个部…

P30_利用GUP训练(二)

P30_利用GUP训练(二)1.代码实战: (1)调用.to()方法即可。 .to(device) device = torch.device("cpu") torch.device("cuda")点击查看代码 #12.定义训练的设备 # device = torch.device("…

重磅!图灵奖得主 Bengio 领衔 30 + 顶流学者联合发文!首次给 AGI 下量化定义

论文标题:A Definition of AGI 作者团队:人工智能安全中心、加州大学伯克利分校、Morph实验室、密歇根大学等 发布时间:2025年10月21日 👉一键直达论文 👉Lab4AI大模型实验室论文阅读 ✅Lab4AI平台提供AI导读和…

GitHub Actions安全漏洞:GITHUB_TOKEN部分泄露风险分析

本文详细分析了CVE-2025-31479安全漏洞,该漏洞会导致GitHub Actions中的GITHUB_TOKEN在异常输出中部分泄露,可能被攻击者利用进行供应链攻击,影响仓库安全性。CVE-2025-31479:canonical/get-workflow-version-acti…

使用 C# 自动创建和格式化 Word 表格

要在 C# 中自动创建和格式化 Word 表格,可借助Microsoft.Office.Interop.Word库或DocX(更轻量,无需安装 Office)。以下分别介绍两种方案的实现方法: 方案一:使用 Microsoft.Office.Interop.Word(需安装 Office)…

Mac SPSS 26 dmg 安装步骤详解 简单易懂一步步教你装(附安装包)

Mac SPSS 26 dmg 安装步骤详解 简单易懂一步步教你装(附安装包)​ SPSS 26​ 是一款专门用来分析数据的软件,很多人做统计、调查、市场研究时会用到。它能帮你算平均数、百分比、做各种图表,还能跑复杂的分析模型,…