当前位置: 首页 > news >正文

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

木棍分割-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.rkmt.cn/news/61913.html

相关文章:

  • yolo入门的一些环境配置记录
  • Go语言的应用场景有哪些?
  • 42
  • 在C#中操作Word文档时,如何处理表格中的数据?
  • 如何使用DocX库在C#中创建和格式化Word表格?
  • elasticsearch创建用户、角色
  • P30_利用GUP训练(二)
  • 使用 C# 自动创建和格式化 Word 表格
  • GitHub Actions安全漏洞:GITHUB_TOKEN部分泄露风险分析
  • NeurIPS 2025Mamba引爆3D重建!MVSMamba:效率与精度双双超越Transformer
  • 委托和事件的区别
  • 2025:如何利用AI不再错过任何一个opening job - M-T
  • NeurlPS 2024! 扩散模型用于世界建模:视觉细节在Atari环境中至关重要| 计算机视觉 | 强化学习2
  • Unclutter 黑五 Mac App 大包测评
  • [豪の算法奇妙冒险] 代码随想录算法训练营第八天 | 344-反转字符串、541-反转字符串II、Carl54-替换数字
  • 31(11.5)
  • 深入解析:GitLab 钩子 + Jenkins 自动化构建项目
  • 27.10.30
  • 抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15
  • 深度学习50问
  • 2025年11月天津防潮公司,北京别墅地下室防潮公司,上海防潮公司权威推荐,防潮技术与市场口碑深度解析
  • 树状数组 线段树 笔记
  • 大模型(LLM)基本原理
  • 实训(补)
  • 2025年下半年江苏网架、钢结构、光伏支架钢管、托辊钢管、汽车传动轴钢管厂家推荐指南:专业选择与权威解析
  • 2025年11月压力容器、化工设备、锅炉、换热器、反应釜厂家怎么选:前五推荐指南
  • 2025年下半年冷弯成型前冲孔生产线、C型钢自动抱焊机、钢结构码垛机、H钢冲孔液压设备、光伏支架冲孔机优质供应商推荐指南
  • 2025年下半年压力容器、化工设备、锅炉、换热器、反应釜厂家综合推荐指南:十大优质供应商深度解析
  • 从“人工寻宝”到“秒级解析”:文档信息抽取技术重塑保险保单处理流程
  • Swift相机功能实战:手把手教你实现扫码、拍照、视频录制全流程 - 指南