P4342 [IOI 1998] Polygon -普及+/提高

P4342 [IOI 1998] Polygon

题目描述

题目可能有些许修改,但大意一致。

Polygon 是一个玩家在一个有 nnn 个顶点的多边形上玩的游戏,如图所示,其中 n=4n = 4n=4。每个顶点用整数标记,每个边用符号 +(加)或符号 *(乘积)标记。

第一步,删除其中一条边。随后每一步:

选择一条边连接的两个顶点 V1V_1V1V2V_2V2,用边上的运算符计算 V1V_1V1V2V_2V2 得到的结果来替换这两个顶点。

游戏结束时,只有一个顶点,没有多余的边。

如图所示,玩家先移除编号为 333 的边。之后,玩家选择计算编号为 111 的边,然后计算编号为 444 的边,最后,计算编号为 222 的边。结果是 000

(译者注:这里每条边的运算符旁边的数字为边的编号,不拿来计算)

编写一个程序,给定一个多边形,计算最高可能的分数。

输入格式

输入描述一个有 nnn 个顶点的多边形,它包含两行。第一行是数字 nnn,为总边数。

第二行描述这个多边形,一共有 nnn 组,每组中第一个字符为边 iii 的计算符号(t 代表相加,x 代表相乘),第二个代表顶点 iii 上的数字。多边形首尾相连。

输出格式

第一行,输出最高的分数。在第二行,输出所有可能的在第一步即被清除后仍能得到最高分的边的下标,以严格升序输出。

输入输出样例 #1

输入 #1

4
t -7 t 4 x 2 x 5

输出 #1

33
1 2

说明/提示

保证 3≤n≤503 \le n \le 503n50

对于任何一系列的操作,顶点数字都在 [−32768,32767][-32768,32767][32768,32767] 的范围内。

solution

动态规划

  • 1 定义公式
  •  f[i][j] :合并 [i, j] 能获得的最大值
    
  •  g[i][j] :合并 [i, j] 能获得的最小值
    
  • 2 递推关系
    • 如果是加号
      f[i][j] = max(f[i][k-1] + f[k][j])
      g[i][j] = max(g[i][k-1] + g[k][j])
    • 如果是乘号
      f[i][j] = max(f[i][k-1] * f[i][k-1], g[i][k-1] * g[i][k-1], f[i][k-1] * g[i][k-1], g[i][k-1] * f[i][k-1])
      g[i][j] = min(f[i][k-1] * f[i][k-1], g[i][k-1] * g[i][k-1], f[i][k-1] * g[i][k-1], g[i][k-1] * f[i][k-1])
  • 3 结果
    • 最大值 max(f[i][i + len - 1])
    • 取大值时 i 即为最开始去掉边

代码

#include "algorithm"
#include "iostream"
#include "unordered_map"
#include "cstring"using namespace std;/** P4342 [IOI 1998] Polygon* 题目大意:* 有一个n(3<=n<=50)的点的环,每个点是一个数,每条边是一个符号(+ or *)。一开始去除一条边。* 然后每次可以去除一条边将两个点合并。问结果最大是多少,最大值对应的最开始去除的是哪个边** 思路:动态规划* 1 定义公式*      f[i][j] :合并 [i, j] 能获得的最大值*      g[i][j] :合并 [i, j] 能获得的最小值* 2 递推关系*      如果是加号*          f[i][j] = max(f[i][k-1] + f[k][j])*          g[i][j] = max(g[i][k-1] + g[k][j])*      如果是乘号*          f[i][j] = max(f[i][k-1] * f[i][k-1], g[i][k-1] * g[i][k-1], f[i][k-1] * g[i][k-1], g[i][k-1] * f[i][k-1])*          g[i][j] = min(f[i][k-1] * f[i][k-1], g[i][k-1] * g[i][k-1], f[i][k-1] * g[i][k-1], g[i][k-1] * f[i][k-1])* 3 结果*      最大值 max(f[i][i + len - 1])*      取大值时 i 即为最开始去掉边*/int f[55][55], g[55][55], n, a[55], ans, t, st[55];
char op[55];int main() {cin >> n;memset(f, 0x80, sizeof f);memset(g, 0x7f, sizeof g);for (int i = 0; i < n; i++) cin >> op[i] >> a[i], f[i][i] = a[i], g[i][i] = a[i];for (int len = 2; len <= n; len++) {for (int i = 0; i < n; i++) {int j = i + len - 1;for (int k = i + 1; k <= j; k++)if (op[k % n] == 't') {f[i][j % n] = max(f[i][j % n], f[i][(k + n - 1) % n] + f[k % n][j % n]);g[i][j % n] = min(g[i][j % n], g[i][(k + n - 1) % n] + g[k % n][j % n]);} else {f[i][j % n] = max({f[i][j % n], f[i][(k + n - 1) % n] * f[k % n][j % n],f[i][(k + n - 1) % n] * g[k % n][j % n], g[i][(k + n - 1) % n] * f[k % n][j % n],g[i][(k + n - 1) % n] * g[k % n][j % n]});g[i][j % n] = min({g[i][j % n], f[i][(k + n - 1) % n] * f[k % n][j % n],f[i][(k + n - 1) % n] * g[k % n][j % n], g[i][(k + n - 1) % n] * f[k % n][j % n],g[i][(k + n - 1) % n] * g[k % n][j % n]});}if (len == n) {if (f[i][j % n] > ans) ans = f[i][j % n], t = 0, st[t++] = i;else if (f[i][j % n] == ans) st[t++] = i;}}}cout << ans << endl;for (int i = 0; i < t; i++) cout << st[i] + 1 << ' ';return 0;
}

结果

在这里插入图片描述

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

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

相关文章

枚举算法和排序算法能力测试

枚举算法题目 1&#xff1a;找出 1-20 中既是偶数又是 3 的倍数的数题目描述&#xff1a;小明想找出 1 到 20 中既能被 2 整除又能被 3 整除的数字&#xff0c;帮他列出来吧。 代码&#xff1a;cpp运行#include <iostream> using namespace std; int main() {int a;for (…

大数据电商流量分析项目实战:Hadoop初认识+ HA环境搭建(二)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/…

【Linux】Linux进程概念(上)

一、冯诺依曼体系结构我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器。它们大部分都遵守冯诺依曼体系。截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个硬件组件组成。输入单元&#xff1a;键盘、鼠标、扫描仪、写板等中央处…

GESP C++ 一~二级拓展课(一)

课题及解析建议用时60分钟&#xff0c;作业及讲解建议用时50分钟。 课题及解析&#xff1a; 4003&#xff1a;【GESP2303二级】画三角形 【题目描述】 输入一个正整数 n&#xff0c;请使用大写字母拼成一个这样的三角形图案&#xff08;参考样例输入输出&#xff09;&#xff…

Kubernetes Ingress:使用 Apache APISIX 进行外部流量路由

什么是 Ingress&#xff1f; 在 Kubernetes 中&#xff0c;随着微服务架构的广泛应用&#xff0c;集群中的服务需要暴露到外部&#xff0c;以便供用户或其他服务访问。如何高效、安全地管理这些流量&#xff0c;成为了一个重要的议题。Ingress 作为 Kubernetes 提供的一种资源&…

Elasticsearch的理解与使用

在大数据与云计算时代&#xff0c;“高效检索” 与 “实时分析” 成为业务突破的关键能力。Elasticsearch&#xff08;简称 ES&#xff09;作为一款开源分布式搜索与分析引擎&#xff0c;凭借其低延迟、高可扩、强灵活的特性&#xff0c;已成为日志分析、全文检索、业务监控等场…

利用FFmpeg自动批量处理m4s文件

缓存了一些视频m4s文件&#xff0c;只能用指定的软件打开&#xff0c;网上查了一下&#xff0c;需要去掉m4s文件开头的9个0&#xff0c;还要用FFmpeg将两个文件合并成一个文件。 经仔细研究缓存目录和其中文件&#xff0c;发现以下特点&#xff1a;“缓存目录”中有很多“数字文…

MLLM学习~M3-Agent Prompt学习

Prompt “输入→处理→输出→评估” 全流程 Prompt 并非孤立存在&#xff0c;形成了完整的视频理解链路&#xff1a; 视频原始数据&#xff08;语音 / 图像&#xff09;→ 模块 1&#xff08;提取语音 绑定人物 ID&#xff09;→ 模块 2&#xff08;生成情景记忆描述&#xff…

Ubuntu 20.04安装显卡驱动、CUDA、Miniconda和Pytorch(2025.06最新)-Ubuntu从零搭建深度学习环境

文章目录一、安装显卡驱动1.1 查看显卡型号1.2 根据显卡型号选择驱动1.3 获取下载链接1.4 查看下载的显卡驱动安装文件1.5 更新软件列表和安装必要软件、依赖1.6 卸载原有驱动1.7 禁用默认驱动1.8 安装lightdm显示管理器1.9 停止显示服务器1.10 在文本界面中&#xff0c;禁用X-…

PyCharm 连接 AutoDL 远程服务器

实验室的电脑性能不行了&#xff0c;所以想着租一台服务器&#xff0c;然后还想使用PyCharm在本地编程&#xff0c;因此就查找相关资料&#xff0c;这里记录一下配置过程&#xff0c;方便以后查阅。 PyCharm 连接 AutoDL 远程服务器PyCharm 连接服务器上传数据集到服务器运行代…

Spark广播变量HttpBroadcast和TorrentBroadcast对比

HttpBroadcast会在driver端的BlockManager里面存储广播变量对象&#xff0c;并且将该广播变量序列化写入文件中去。所有获取广播数据请求都在driver端&#xff0c;所以存在单点故障和网络IO性能问题。 TorrentBroadcast会在driver端的BlockManager里面存储广播变量对象&#xf…

新手向:C语言、Java、Python 的选择与未来指南

语言即工具&#xff0c;选对方向比埋头苦学更重要你好&#xff0c;编程世界的新朋友&#xff01;当你第一次踏入代码的宇宙&#xff0c;面对形形色色的编程语言&#xff0c;是否感到眼花缭乱&#xff1f;今天我们就来聊聊最主流的三种编程语言——C语言、Java 和 Python——它们…

收集飞花令碎片——C语言关键字typedef

在C语言的指针章节中&#xff0c;我们讲到函数指针模块 在函数指针中&#xff0c;有一个重要的关键字&#xff1a;typedef typedef关键字作用基本语法重难点&#xff1a;对数组指针与函数指针的重命名数组指针重命名一维数组指针重命名遍历二维数组函数指针重命名作用 typedef是…

基于Spring Boot的家政服务管理系统+论文示例参考

1.项目介绍 系统角色&#xff1a;管理员、家政服务、服务人员功能模块&#xff1a;用户管理、服务人员、服务类型、家政服务、服务预约、接单信息、服务记录、评价信息、反馈投诉等技术选型&#xff1a;SpringBoot&#xff0c;Vue等测试环境&#xff1a;idea2024&#xff0c;jd…

AI助力HTML5基础快速入门:从零开始理解网页结构

前言 作为一名前端开发初学者&#xff0c;理解HTML的基本结构是你踏入Web开发世界的第一步。HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;就像盖房子需要先搭建好框架一样&#xff0c;学习HTML就是学习如何构建网页的基本骨架。今天&#xff0c;我…

实现调用libchdb.a静态连接库中的未公开导出函数

前文写了调用libchdb.so动态连接库中的未公开导出函数的方法&#xff0c;不久前chdb发布了3.6版&#xff0c;其中提供了静态链接库。 尝试编译一个不依赖庞大动态连接库libchdb.so的程序&#xff0c;获得了成功&#xff0c;以下是操作步骤。 1.下载chdb静态连接库 wget https:…

HTTPS 端口号详解 443 端口作用、iOS 抓包方法、常见 HTTPS 抓包工具与网络调试实践

在现代互联网中&#xff0c;几乎所有移动应用和网站都使用 HTTPS 协议 来保障数据安全。而 HTTPS 的默认端口就是 443。相比 HTTP 的 80 端口&#xff0c;443 不仅增加了 SSL/TLS 加密&#xff0c;还涉及到证书验证和加密握手&#xff0c;这使得开发者在进行 HTTPS 抓包 时面临…

【Python系列PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘pyqt5’问题

【Python系列PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘pyqt5’问题 摘要 在日常Python开发中&#xff0c;使用PyCharm控制台执行pip install时经常会遇到ModuleNotFoundError: No module named pyqt5等类似报错。这类报错不仅…

“可信资产IPO +数链金融RWA” 链改2.0六方共识(深圳)

“可信资产IPO 数链金融RWA”链改2.0六方共识【2025年8月30日 深圳】全球数链金融的建设者、创新者与决策者&#xff1a;我们——来自“生态、项目、资金、合规、技术、行业”六方领域的实践者&#xff0c;在链改1.0的基础上于深圳达成链改2.0时代核心共识&#xff1a;以“可信…

华为云 GaussDB:金融级高可用数据库,为核心业务保驾护航

一、文档概述在数字化浪潮席卷全球的当下&#xff0c;数据已成为企业发展的核心战略资产&#xff0c;而数据库作为数据存储、管理与交互的核心载体&#xff0c;其稳定性、可靠性与安全性直接决定了企业业务的连续性与竞争力。尤其在对数据准确性、业务连续性要求近乎苛刻的金融…