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

news2024/11/27 14:49:26
线上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;
}

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

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

相关文章

IEDA 默认集成依赖概述

IEDA 默认集成依赖概述 目录概述需求&#xff1a; 设计思路实现思路分析 1.Developer Tools:GraalVM Native supportGraphQL DGs Code GenerationSpring Boot DevToolsLombokSpring Configuration ProcessorDocker Compose supportSpring Modulith 2.WebWebSpring WebSpring Re…

安卓约束性布局学习

据说这个布局是为了解决各种布局过度前套导致代码复杂的问题的。 我想按照自己想实现的各种效果来逐步学习&#xff0c;那么直接拿微信主页来练手&#xff0c;用约束性布局实现微信首页吧。 先上图 先实现顶部搜索框加号按钮 先实现 在布局中添加一个组件&#xff0c;然后摆放…

java web:springboot mysql开发的一套家政预约上门服务系统源码:家政上门服务系统的运行流程

java web&#xff1a;springboot mysql开发的一套家政预约上门服务系统源码&#xff1a;家政上门服务系统的运行流程 家政上门服务系统的优势 服务质量更稳定&#xff1a;由专业的家政人员提供服务&#xff0c;经过严格的培训和筛选。 价格更透明&#xff1a;采用套餐式收费&…

java的核心机制:JVM

JVM&#xff08;java virtual machine&#xff0c;java虚拟机&#xff09;&#xff1a;是一个虚拟的计算机&#xff0c;是java程序的运行环境。JVM具有指令集并使用不同的存储区域&#xff0c;负责执行指令&#xff0c;管理数据、内存、寄存器。 JVM功能1&#xff1a;实现java程…

以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】

【Less-54】 与前面的题目不同是&#xff0c;这里只能提交10次&#xff0c;一旦提交超过十次&#xff0c;数据会重新刷新&#xff0c;所有的步骤需要重来一次。 解题步骤&#xff1a; 根据测试&#xff0c;使用的是单引号闭合。 # 判断字段的数量 ?id1 order by 3 -- aaa# …

力扣 有效的括号 栈

Problem: 20. 有效的括号 文章目录 思路复杂度&#x1f49d; Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f49d; Code class Solution {static Map<Character, Character> m…

香橙派 Orange AIpro 测评记录视频硬件解码

香橙派 Orange AIpro 测评记录视频硬件解码 香橙派官网&#xff1a;http://www.orangepi.cn/ 收到了一块Orange Pi AIpro开发板&#xff0c;记录一下我的测评~测评简介如下&#xff1a;1.连接网络2.安装流媒体进行硬件解码测试3.安装IO测试 简介 Orange Pi AI Pro 是香橙派联合…

i.MX8MP平台开发分享(RDC软件配置篇)

Uboot中已经将RDC的配置写入到了OCRAM中&#xff0c;NXP在ATF中预设了SIP服务&#xff0c;SIP服务下有厂商自定义的smc命令ID。例如下面的DDR、GPC、SRC和HAB的smc回调函数。 在SRC中断处理函数中&#xff0c;对于SRC_M4_START指令&#xff0c;先读取OCRAM中的配置&#xff0c;…

web-上传项目文件夹到Git远程仓库

Git初识 概念&#xff1a;一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 检验成功 打开bash终端&#xff08;git专用&#xff09;命令…

中缀表达式和前缀后缀

在中缀表达式中&#xff0c;操作数可能与两个操作符相结合 但是&#xff0c;想要不带括号无歧义&#xff0c;且不需要考虑运算符优先级和结合性 所以考虑 前缀表达式&#xff0c;波兰表达式 后缀表达式 逆波兰表达式 对于人来说&#xff0c;中缀表达式是最容易读懂的。但是对于…

数据库存储过程和锁机制

存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的&#xff0c;存储过程思想上很简单,就是数据库SQL语言层面的代码封装与有重用 …

Django框架中级

Django框架中级 – 潘登同学的WEB框架 文章目录 Django框架中级 -- 潘登同学的WEB框架 中间件自定义中间件常用中间件process_view() 使用中间件进行URL过滤 Django生命周期生命周期分析 Django日志日志配置filter过滤器自定义filter 日志格式化formatter Django信号内置信号定…

深入了解反射

newInstance 可访问性限制&#xff1a; newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数&#xff0c;那么newInstance()方法将无法使用。 异常处理&#xff1a; newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAcces…

【数据分享】《中国文化文物与旅游统计年鉴》2022

最近老有同学过来询问《中国旅游年鉴》、《中国文化文物统计年鉴》、《中国文化和旅游统计年鉴》、《中国文化文物与旅游统计年鉴》&#xff0c;这四本年年鉴的关系以及怎么获取这四本年鉴。今天就在这里给大家分享一下这四本年鉴的具体情况。 实际上2018年&#xff0c;为适应…

【WEB前端2024】智体OS:poplang编程控制成本小千元的长续航robot机器人底盘(开源)

【WEB前端2024】智体OS&#xff1a;poplang编程控制成本小千元的长续航robot机器人底盘&#xff08;开源&#xff09; 前言&#xff1a;dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角游览3D场馆&#xff09;…

数据库分库分表mycat

为啥要分库分表 IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 请求数据太多&#xff0c;带宽不够&#xff0c;网络IO瓶颈。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源&#…

Python中猴子补丁是什么,如何使用

1、猴子补丁奇遇记 &#x1f412; 在Python的世界深处&#xff0c;隐藏着一种神秘而又强大的技巧——猴子补丁&#xff08;Monkey Patching&#xff09;。这是一项允许你在程序运行时动态修改对象&#xff08;如模块、类或函数&#xff09;的行为的技术。它得名于其“快速修补…

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…

24考研408大变化,25考研高分上岸规划+应对策略

巧了&#xff0c;我有现成的经验&#xff1a; 数学和专业课的成绩都不高不低&#xff0c;刚好够用&#xff0c;其实408想上岸&#xff0c;不仅仅要学好408&#xff0c;还要学好考研数学&#xff0c;这是我的肺腑之言&#xff0c;我复试的时候&#xff0c;我知道的那些没有进复试…

【无标题】 Notepad++ plugin JSONViewer 下载地址32位

JSONViewer download | SourceForge.net 1、下载插件压缩包并解压出dll&#xff1a;Jsonviewer2.dll&#xff08;64位&#xff09;或NPPJSONViewer.dll&#xff08;32位&#xff09;; 2.、拷贝对应dll到Notepad安装目录下的plugins目录。 3、重启Notepad程序&#xff0c;在插…