news 2026/3/2 2:11:44

P1043 [NOIP 2003 普及组] 数字游戏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P1043 [NOIP 2003 普及组] 数字游戏

#环形结构\#破环成链\#区间DP

这道题是关于一个环上的区间DP问题,n个数字收尾相连成一个环,我们的任务是把n个数分成m个部分,各个部分内的数相加并对10取模再相乘,最后得到一个k值。要求求出k的最大值和最小值。


前置知识

区间DP

DP问题的变种,一种解决涉及连续区间的最优性问题的有效方法。通过求出所有较小区间的最优解,地推出包含它们的较大区间的最优解,具有动态规划的最优子结构和无效性的特性。

状态转移方程如下

dp[i][j]=min or max(dp[i][j],dp[i][q]opdp[q+1][j])

注意整个动态规划的过程中Len=j-i需要从小到大执行

for(len=2 to N)

for(i = 1 to N - Len + 1)

j = i + len - 1

for(q = i to j - 1)

这道题在这个基础上加了一个因素,就是我们有k​个区间。

状态定义:dp[i][j][k]表示将子序列A[i...j]恰好划分成k个连续子序列所得的最优解。

核心思想:当我们从i开始到j结束,切割点为q,我们需要从i到q的k-1个区间的最优解,推出i到j之间k个区间的最优解。

破环成链

在算法竞赛中,我们会经常遇到环形结构。这类问题会因为首尾相连的特性变得特别复杂。

“破环成链”是一种思维技巧和模板化处理这类问题的预处理方法,目的是将环形结构转化为我们更容易处理的链式(线性)问题。

核心思想:复制一份环上的元素,接到原序列的末尾,形成一个2N的线性序列。

类比:1000米赛跑

一般学校的操场跑道只有400米,当我们需要跑1000米时,可以将操场变成400米的直线跑道,第二圈接到第一圈后面变成800米,第三圈的半圈接到后面变成1000米。

对于这道题我们只需要复制成2N​即可,因为这个长度从环上任意一点开始,包含N​个元素的子序列。

题解代码

#include<bits/stdc++.h> using namespace std; ​ const int N=105,M=15; long long Max[N][N][M]; long long Min[N][N][M]; long long num[N],s[N]; ​ int mod10(long long val) { int res = val % 10; if (res < 0) { res += 10; // 确保负数取模结果在 [0, 9] } return res; } ​ int main() { int n,m; cin>>n>>m; ​ s[0]=0; for(int i=1;i<=n;i++) { cin>>num[i]; num[i+n]=num[i]; s[i]=s[i-1]+num[i]; } for(int i=1;i<=2*n;i++) // 循环到 2n { s[i]=s[i-1]+num[i]; // s[i] 存储 num[1] 到 num[i] 的和 (1-indexed) } for (int i = 1; i <= 2 * n; ++i) { for (int j = i; j <= 2 * n; ++j) { int val = mod10(s[j] - s[i - 1]); Max[i][j][1] = val; Min[i][j][1] = val; } } for(int k=2;k<=m;k++) { for(int len=k;len<=2 * n;len++) { for(int i=1;i<=2 * n-len+1;i++) { int j=i+len-1; Max[i][j][k]=INT_MIN; Min[i][j][k]=INT_MAX; for(int q=i + k - 2;q<j;q++) { int v=mod10(s[j]-s[q]); Max[i][j][k]=max(Max[i][j][k],Max[i][q][k-1]*v); Min[i][j][k]=min(Min[i][j][k],Min[i][q][k-1]*v); } } } } long long finalmin=INT_MAX,finalmax=INT_MIN; for(int i=1;i<=n;i++) { if(finalmin>Min[i][i+n-1][m]) finalmin=Min[i][i+n-1][m]; if(finalmax<Max[i][i+n-1][m]) { finalmax=Max[i][i+n-1][m]; } } cout<<finalmin<<endl<<finalmax; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 17:00:48

刷到 “网安月薪 3 万” 就心动?先打住!这 4 个坑一定要绕开!

前几天收到个私信&#xff0c;大二学生说 “跟风报了网安培训班&#xff0c;学了半年只会跑 Nessus 扫漏洞&#xff0c;投简历全石沉大海”—— 其实不是他学得差&#xff0c;是一开始就踩了入行误区。 现在网上的说法&#xff0c;很容易让人脑子一热就扎进来&#xff0c;但真…

作者头像 李华
网站建设 2026/2/26 14:24:15

从零搭建量子计算开发环境:镜像缓存构建的4个核心原则与实操技巧

第一章&#xff1a;量子计算开发环境概述量子计算作为下一代计算范式的前沿领域&#xff0c;其开发环境的搭建是进入该领域的第一步。与传统软件开发不同&#xff0c;量子计算依赖于特定的量子编程框架和模拟器&#xff0c;以支持量子比特操作、量子线路构建以及结果测量等核心…

作者头像 李华
网站建设 2026/2/25 19:07:33

针对一个嵌入式AI视觉http后端系统的设计

AI视觉后端系统详细设计文档 个人专著《C++元编程与通用设计模式实现》由清华大学出版社出版。该书内容源于工业级项目实践,出版后市场反馈积极(已加印)。其专业价值获得了图书馆系统的广泛认可:不仅被中国国家图书馆作为流通与保存本收藏,还被近半数省级公共图书馆及清华…

作者头像 李华
网站建设 2026/2/18 23:59:48

HTTP 无状态与 Cookie 状态保持机制详解

HTTP 无状态与 Cookie 状态保持机制详解 一、背景&#xff1a;HTTP 真的是“无状态”吗&#xff1f; HTTP 被称为无状态协议&#xff0c;并不是说它完全无法“记住”用户&#xff0c;而是&#xff1a; 每一次 HTTP 请求在协议层面都是相互独立的服务器不会天然保存客户端的上下…

作者头像 李华
网站建设 2026/2/26 18:09:18

计算机网络基础

网络定义 多台设备通过连接介质&#xff0c;能互相传数据&#xff0c;共享资源的集合 协议&#xff1a;设备之间的沟通规则 拓扑结构 网络设备的物理连接方式 星型&#xff1a;就是有一个中间的设备转一下 总线型&#xff1a;学校机房那种所有设备连着一台设备 环型&#xff1a…

作者头像 李华