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]);
            }

            // 枚举 K
            for(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IIoT(智能物联网)的现状、应用及安全

近年来&#xff0c;物联网&#xff08;IoT&#xff09;作为推动现代公司和智能城市发展的一个范式&#xff0c;已经取得了显著的发展。IoT使得分布式设备&#xff08;如手机、平板电脑和计算机&#xff09;能够感知并从外部环境传输数据&#xff0c;以服务于最终用户。IoT的概念…

菜品信息分页查询——后端SpringBoot

1.分页查询的逻辑&#xff1a; 页面发送ajax请求&#xff0c;将分页查询参数(page&#xff0c;pageSize, name)提交到服务端&#xff0c;获取分页数据&#xff1b; 页面发送请求&#xff0c;请求服务端进行图片下载&#xff0c;用于页面图片展示。 开发菜品信息分页查询功能&a…

【动态规划-BM79 打家劫舍(二)】

题目 BM79 打家劫舍(二) 描述 你是一个经验丰富的小偷&#xff0c;准备偷沿湖的一排房间&#xff0c;每个房间都存有一定的现金&#xff0c;为了防止被发现&#xff0c;你不能偷相邻的两家&#xff0c;即&#xff0c;如果偷了第一家&#xff0c;就不能再偷第二家&#xff0c;如…

uc_os操作练习

目录 一、CubeMX配置 二、获取uc-os源码 三、代码移植 四、代码修改 五、总结 六、参考资料 一、CubeMX配置 首先进入CubeMX&#xff0c;&#xff0c;新建工程&#xff0c;选择STM32F103C8T6芯片&#xff0c;照例配置好RCC和SYS。 然后配置GPIO输出&#xff0c;这里选择P…

牛客NC32 求平方根【简单 二分 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/09fbfb16140b40499951f55113f2166c 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** para…

注册小程序

每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使用请参考 App 参考文档 。 整个小程序只有一个 App 实例&#xff0c;是全部页面共享的。开发者可以通过 getApp 方法获取到全…

轻松搞定阿里云域名DNS解析

本文将会讲解如何设置阿里云域名DNS解析。在进行解析设置之前&#xff0c;你需要提前准备好需要设置的云服务器IP地址、域名以及CNAME记录。 如果你还没有云服务器和域名&#xff0c;可以参考下面的方法注册一个。 申请域名&#xff1a;《Namesilo域名注册》注册云服务器&…

Polar Web【简单】PHP反序列化初试

Polar Web【简单】PHP反序列化初试 Contents Polar Web【简单】PHP反序列化初试思路EXP手动脚本PythonGo 运行&总结 思路 启动环境&#xff0c;显示下图中的PHP代码&#xff0c;于是展开分析&#xff1a; 首先发现Easy类中有魔术函数 __wakeup() &#xff0c;实现的是对成员…

JVM学习-内存泄漏

内存泄漏的理解和分类 可达性分析算法来判断对象是否是不再使用的对象&#xff0c;本质都是判断一上对象是否还被引用&#xff0c;对于这种情况下&#xff0c;由于代码的实现不同就会出现很多内存泄漏问题(让JVM误以为此对象还在引用&#xff0c;无法回收&#xff0c;造成内存泄…

Mysql学习(六)——函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 三、函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 三、函数 函数是指一段可以直接被另一段程序调用的程序或代码。 3.1 字符串函数 MySQL中内置了很…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:大疆RoboMaster AI挑战赛

NVIDIA Jetson TX2助力机器人战队斩获RoboMaster AI挑战赛冠亚军 一个汇聚数百万机器人专家与研究人员的赛场&#xff0c;一场兼具工程、策略和团队挑战的较量&#xff0c;说的正是近日刚刚在澳大利亚布里斯本ICRA大会上闭幕的大疆RoboMaster AI挑战赛今年的冠军I Hiter以及亚军…

【传知代码】DETR[端到端目标检测](论文复现)

前言&#xff1a;想象一下&#xff0c;当自动驾驶汽车行驶在繁忙的街道上&#xff0c;DETR能够实时识别出道路上的行人、车辆、交通标志等目标&#xff0c;并准确预测出它们的位置和轨迹。这对于提高自动驾驶的安全性、减少交通事故具有重要意义。同样&#xff0c;在安防监控、…

Elasticsearch 认证模拟题 - 16

一、题目 创建一个搜索模版&#xff0c;要求 match_prase 查询&#xff0c;并且用指定的格式高亮&#xff0c;并排序 # 创建索引 PUT my_index {"settings": {"number_of_replicas": 0,"number_of_shards": 1},"mappings": {"p…

Vitis HLS 学习笔记--初始化与复位

目录 1. 简介 2. 控制初始化与复位 2.1 初始化 2.2 复位 2.3 全局复位选项 2.4 复位排除 3. 阵列初始化和复位 3.1 不使用 static 限定符 3.2 使用 static 限定符 3.3 BRAM 和 URAM 4. 总结 1. 简介 本文对比分析两个方面的初始化和复位&#xff1a;阵列和控制&…

自动化立体库集成技术--含(思维导图)

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着科技的不断进步和物流行业的快速发展&#xff0c;自动化立体库集成技术已成为现代物流仓储的重要支撑。 它利用先进的自动化设备和智能化管理…

植物大战僵尸杂交版2024潜艇伟伟迷

在广受欢迎的游戏《植物大战僵尸》的基础上&#xff0c;我最近设计了一款创新的杂交版游戏&#xff0c;简直是太赞了&#xff01;这款游戏结合了原有游戏的塔防机制&#xff0c;同时引入新的元素、角色和挑战&#xff0c;为玩家提供了全新的游戏体验。 植物大战僵尸杂交版最新绿…

【2024】Kafka Streams详细介绍与具体使用(1)

目录 介绍关键特性应用场景核心概念部署方式kafka streams的处理模式 具体使用1、准备工作2、添加依赖3、代码实现3、测试 介绍 Kafka Streams是构建在Apache Kafka之上的客户端库&#xff0c;用于构建高效、实时的流处理应用。它允许你以高吞吐量和低延迟的方式处理记录流&am…

Java中的IO流字节流(FileOutputStream与FileInputStream)+编码与解码

目录 ​编辑 IO流 File0utputstream FileOutputstream写数据的3种方式 void write(int b) 一次写一个字节数据 void write(byte[] b) 一次写一个字节数组数据 void write(byte[] b,int off,int len) 一次写一个字节数组的部分数据 FileOutputstream写数据的…

STM32F103C8开发板 STM32最小系统核心板 AD硬件原理图+PCB封装文件分享

STM32F103C8开发板原理图 原理图和PCB下载地址&#xff1a; STM32F103C8开发板 STM32最小系统核心板 AD硬件原理图PCB封装文件.zip: https://url83.ctfile.com/f/45573183-1269573020-8f85b2?p7526 (访问密码: 7526)

进程通信(IPC-Inter Process Communication)

进程之间的通信通过内核空间实现 IPC技术 ①管道(匿名管道/命名管道-FIFO队列) ②System V IPC(消息队列、信号量和共享内存) ③套接字(UNIX套接字&Internet套接字) ※信号 软中断&#xff0c;信号提供了一种处理异步事件的方法&#xff0c;作为进程通信的一种机制&am…