2003NOIP普及组真题 3. 数字游戏

线上OJ 地址:

【03NOIP普及组】数字游戏

此题考察的是 区间DP + 前缀和

核心思想:

1、这道题主要考查了动态规划的思想。通过分析题目,可以发现需要 枚举环上所有划分为m组 的不同方案,来求得最大或最小值。属于 环上动态规划 问题,可以 破环成链,变成区间dp问题

备注:

环形 结构上的动态规划问题,是一种特殊的区间动态规划问题。由于存在 环形后效性,所以 不满足动态规划算法无后效性 约束条件。故常将环形结构上的动态规划问题,通过 “断环为链” 策略 转化为线性动态规划 问题求解。
断环为链 策略具体来说就是“ 把环断开为链,然后复制一倍接在末尾 ”,通过这种方式可以将环形结构上的动态规划问题转化为线性结构上的动态规划问题,然后使用线性动态规划的方法进行求解。本段引用。

在这里插入图片描述

2、在本题中,
2.1 设置状态 f[L][R][K] 表示从 L 到 R 这段长度为 R - L + 1 的连续序列划分为 K 组的 最小值;
2.2 设置状态 b[L][R][K] 表示从 L 到 R 这段长度为 R - L + 1 的连续序列划分为 k 组的 最大值;

在这里插入图片描述

因为 划分为 K 段的最小值 ,是从 划分为 K - 1 段的最小值 转移而来。即 f[K] = f[K-1] * 最后一段数值和

注解:
如上图所示,设左区间端点是L,右区间端点是R,在L和R之间找一点 J来区分最后一段。我们枚举 J的位置。
因为:
1、L -> J 为 K - 1 段,所以 J − L + 1 ≥ K − 1 J - L + 1 ≥ K - 1 JL+1K1,所以 J ≥ L + K − 2 J ≥ L + K -2 JL+K2
2、J+1 -> R为最后1段,所以 J + 1 ≤ R J+1 ≤ R J+1R,所以 J ≤ R − 1 J ≤ R - 1 JR1
所以 J 的范围是 J ∈ [ L + k − 2 , R − 1 ] J ∈ [L + k - 2,R - 1] J[L+k2R1]

所以动态转移方程为:

f [ L ] [ R ] [ K ] = m i n ( f [ L ] [ R ] [ K ] , f [ L ] [ J ] [ K − 1 ] ∗ ( a J + 1 + . . . + a R ) ) f [L][R][K] = min( f[L][R][K], f[L][J][K - 1] * (a_{J+1}+...+a_R) ) f[L][R][K]=min(f[L][R][K],f[L][J][K1](aJ+1+...+aR));
b [ L ] [ R ] [ K ] = m a x ( b [ L ] [ R ] [ K ] , b [ L ] [ J ] [ K − 1 ] ∗ ( a J + 1 + . . . + a R ) ) b [L][R][K] = max( b[L][R][K], b[L][J][K - 1] * (a_{J+1}+...+a_R) ) b[L][R][K]=max(b[L][R][K],b[L][J][K1](aJ+1+...+aR));

为了快速计算,我们记 s[n] 为前 n 项的 前缀和 数组,则上式中的 a J + 1 + . . . + a R = s [ R ] − s [ J ] a_{J+1}+...+a_R = s[R] - s[J] aJ+1+...+aR=s[R]s[J]

题解代码:
#include <bits/stdc++.h>
using namespace std;const int N = 110, M = 10;   // N = 2*n + 余量。n上限为50 
const int INF = 0x3f3f3f3f;  // 无穷大 
const int NINF = 0xafafafaf; // 无穷小 int n, m;
int a[N], s[N]; // a[]为数值;s[]为前缀和 
int f[N][N][M]; // f[L][R][K] 表示从 L 到 R 这段长度为 R - L + 1 的连续序列划分为 K 组的最小值 
int b[N][N][M]; // b[L][R][K] 表示从 L 到 R 这段长度为 R - L + 1 的连续序列划分为 k 组的最大值;
int max_ans = NINF;  
int min_ans = INF;    // 计算 num对 10的模。如果是负数,需转成整数 
int get_mod(int num)  
{return (num % 10 + 10) % 10; // 调整负数模为非负整数     
}int main()
{scanf("%d %d", &n, &m);for(int i = 1; i <= n; i ++){scanf("%d", &a[i]);a[i + n] = a[i];  // 把环断开为链,然后复制一倍接在末尾}for(int i = 1; i <= n * 2; i ++)  a[i] = get_mod(a[i]);  // 计算前先对10取模 // 求前缀和for(int i = 1; i <= n * 2; i ++)  s[i] = s[i - 1] + a[i];memset(f, 0x3f, sizeof(f));  // 将最小值初始化为无穷大 memset(b, 0xaf, sizeof(b));  // 将最大值初始化为无穷小 for(int len = 1; len <= n; len++) // 外围枚举所有用到的区间长度,从1开始 {for(int l = 1; l + len - 1 < n * 2; l++) // 在每一个区间长度下,枚举左端点的位置 {int r = l + len - 1; // 区间长度已知,左端点已知,则可计算右端点 f[l][r][1] = b[l][r][1] = get_mod(s[r] - s[l - 1]);  // 在只划分1个区间的情况下,f 和 b 就是区间内的元素和 if(len == n && 1 == m)   // 如果当前区间长度正好是n,且m就是1,则更新待求的最大值和最小值 {min_ans = min(min_ans, f[l][r][m]);max_ans = max(max_ans, b[l][r][m]);}// 枚举 Kfor(int k = 2; k <= m; k++){for(int j = l + k - 2; j <= r - 1; j++)  // j 为划分为 k 个区间的所有可能方案的最右侧划分点的范围:j ∈[L + K - 2, r - 1] {   // “划分为 K 段的最小值”,是从“划分为 K - 1 段的最小值”转移而来。f[l][r][k] = min(f[l][r][k], f[l][j][k - 1] * get_mod(s[r] - s[j]));                   b[l][r][k] = max(b[l][r][k], b[l][j][k - 1] * get_mod(s[r] - s[j]));if(len == n && k == m)  // 如果当前区间长度正好是n,且m就是k,则更新待求的最大值和最小值{min_ans = min(min_ans, f[l][r][m]);max_ans = max(max_ans, b[l][r][m]);						} }            	} }}printf("%d\n%d\n", min_ans, max_ans); return 0;
}

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

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

相关文章

2024.6.7学习记录

1、css面试题复习加整理 2、dp刷题 也是水

动态语言的开源编译器汇总

对于动态语言而言&#xff0c;我们通常不会使用传统意义上的“编译器”&#xff0c;因为动态语言往往是在运行时解释执行的&#xff0c;或者被转换为中间形式&#xff08;如字节码&#xff09;&#xff0c;再由虚拟机执行。不过&#xff0c;为了性能考虑&#xff0c;现代动态语…

阅读笔记——《AFLNET: A Greybox Fuzzer for Network Protocols》

【参考文献】Pham V T, Bhme M, Roychoudhury A. Aflnet: a greybox fuzzer for network protocols[C]//2020 IEEE 13th International Conference on Software Testing, Validation and Verification (ICST). IEEE, 2020: 460-465.【注】本文仅为作者个人学习笔记&#xff0c;…

华媒舍:3步实际操作教大家快速升级活动策划实际效果

什么叫活动策划推广&#xff1f;活动策划推广指通过制定目标与执行一系列活动来推广宣传企业、产品和服务。这种活动可以包括线上与线下宣传营销、社会化营销、品牌合作等各种方式。正确活动策划推广能够帮助企业在竞争激烈的市场中突围&#xff0c;吸引住目标群体并提高销售总…

判断是否是平衡二叉树--c++【做题记录】

【问题描述】 设计算法判断一棵树是否是一棵平衡二叉树。 输入一组数据&#xff0c;按顺序构造出一个二叉排序树&#xff0c;不要平衡化&#xff0c;直接插入数据。判断树是否是平衡二叉树。 【参考算法】 递归算法 bool isBalance(BiNode *bt, int &height) //注意&…

【Java 反射】对于获取修饰符需要知道的事

反射 修饰符返回值 虚拟机规范表4.1、4.4、4.5和4.7中的访问修饰符标志常量 修饰符类型修饰符名称标志值&#xff08;十进制&#xff09;标志值&#xff08;十六进制&#xff09;PUBLIC公共10x00000001PRIVATE私有20x00000002PROTECTED保护40x00000004STATIC静态80x00000008…

堆排序---C语言

堆排序详解&#xff1a;点这里。 使用向下调整算法实现堆排序&#xff0c;完整代码 #include<stdio.h>void Swap(int* p1, int* p2) {int* tmp *p1;*p1 *p2;*p2 tmp; }void Print(int* arr, int n) {for (int i 0; i < n; i){printf("%d ", arr[i]);}…

【16】编写shell-批量导入mysql的sql语句

说明: 1、定时备份mysql的表sql语句,并且保留30天文件夹,会定期删除30天前的文件夹 2、根据业务场景需要,需要定时将表数据导出sql语句 3、定时将sql语句推送到另外指定的数据库中 4、编写shell脚本是实现批量导入mysql的sql语句 一、Shell脚本备份mysql表数语句 # !/bin/…

大语言模型的sft

https://zhuanlan.zhihu.com/p/692892489https://zhuanlan.zhihu.com/p/6928924891.常见的sft的开发流程 a.根据业务场景调整提示词;越详细越好,不要让模型理解歧义,拆分。 b.尝试闭源和开源,以评估LLM能够解决这类场景问题。 c.准备数据,包括多个子任务。 d.训练上线…

电脑提示缺失iUtils.dll文件怎么办,分享几种靠谱的解决方法

在现代科技发展迅猛的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;随着使用时间的增长&#xff0c;电脑也会出现一些问题&#xff0c;其中之一就是开机时弹出窗口提示找不到iUtils.dll文件。这个问题可能会给用户带来困扰和不便&#xff0c;…

Maven下载、安装、配置与使用教程

Maven下载、安装、配置与使用教程 目录 简介下载与安装配置使用示例总结 1. 简介 Maven是一个项目管理工具&#xff0c;主要用于Java项目。它可以自动化构建过程&#xff0c;包括编译、测试、打包和部署等。Maven使用POM&#xff08;Project Object Model&#xff09;文件来…

Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码&#xff1a; import tkinter as tk from tkinter import messagebox,ttk from tkinter import simpledialog from ui.car_ui import start_car_ui# 设置主题风格 style ttk.Style() style.theme_use("default") # 可以根据需要选择不同的主题…

切莫被人工智能的洪流吞噬

切莫被人工智能的洪流吞噬 当今社会似乎正在被“人工智能”的概念淹没&#xff0c;各行各业也都期望能与其挂钩&#xff0c;彷佛这就是新世代下的灵药&#xff0c;有人把这一现象称为“旧互联网时代的新革命”。但是我们&#xff0c;这一现象的缔造者&#xff0c;又处于这洪流…

Linux基础指令文件管理004

本章主要讲述如何查找文件。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 指令find [rootlocalhost a]# find -name "*.txt"查找当前目录下的所有.txt文件 ./b/3.txt ./b/4.txt ./1.txt[rootlocalhost a]# find . #查找文件 . ./b ./b/c ./b/3.t…

360数字安全:2024年2月勒索软件流行态势分析报告

勒索软件传播至今&#xff0c;360反勒索服务已累计接收到数万勒索软件感染求助。随着新型勒索软件的快速蔓延&#xff0c;企业数据泄露风险不断上升&#xff0c; 勒索金额在数百万到近亿美元的勒索案件不断出现。勒索软件给企业和个人带来的影响范围越来越广&#xff0c;危害性…

【Android面试八股文】Android两种序列化方式Serialzable和Parcelable有什么区别?为什么Intent传递对象需要序列化?

文章目录 序列Parcelable,Serializable的区别?这道题想考察什么?考察的知识点考生应该如何回答Bunder传递对象为什么需要序列化?Serializable,简单易用基本使用serialVersionUIDParcelable , 速度至上Parcel区别测试速度对比测试方法结果总结序列Parcelable,Serializable的…

BOT算不算作弊

https://arxiv.org/abs/2406.04271 1. 引言 介绍大型语言模型&#xff08;LLMs&#xff09;在推理任务中的局限性。 概述现有推理方法的分类和局限性&#xff1a;单次查询推理和多查询推理。 提出Buffer of Thoughts (BoT) 框架&#xff0c;旨在提高LLMs的推理准确性、效率和…

npm安装依赖过慢

今天在使用npm安装taro框架的依赖时&#xff0c;速度慢到吐血&#xff0c;使用了淘宝镜像源依然很慢&#xff0c;安装一个多小时没反应&#xff0c;最后清理了缓存再次安装速度就快很多了&#xff0c;因此解决方法大致有两种&#xff1a; 使用淘宝镜像源 原域名&#xff1a; ht…

计算机网络--计算机网络概念

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 0.计算机网络简介 0.2 计算机网络的功能简介 数据通信(连通性)资源共享&#xff1a; 软件硬件数据 分布式处理 多台计算机各自承担同…

项目-双人五子棋对战:匹配模块的实现(4)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 在上一篇中, 我们已经讲到了匹配模块中前后端的接口约定, 也讲到了前后端它们是怎么完成发送请求, 接收请求, 处理响应, 返回响应这个过程的. 在这一篇中, 我们将对匹配模块用到的一些组件, 进行讲解. 后端代码 匹配器…