Codeforces Edu 74 E. Keyboard Purchase 【状压DP +贡献】

news2025/1/18 18:05:54

E. Keyboard Purchase

E

题意

给定一个长度为 n n n 的字符串 s s s 仅由前 m m m 个小写字母组成

现在要求求出包含前 m m m 个小写字母的键盘,使得在键盘上敲出 s s s 要移动的距离最短

移动总距离为: ∑ i = 2 n ∣ p o s s i − 1 − p o s s i ∣ \sum_{i = 2}^{n} | pos_{s_{i - 1}} - pos_{s_{i}}| i=2npossi1possi

p o s s i pos_{s_i} possi s i s_i si 在键盘上的位置

思路

由于 m m m 很小,我们考虑在键盘上跑状压 D P DP DP,如果当前已经排好了集合 S S S 中的那些位,枚举当前的字母的话,假设当前枚举的不在 S S S 中的字母为 i i i,那么我们就需要找到 s s s 中和字母 i i i 相邻的那些字母 j j j,因为它们相邻,所以要 j → i j \rightarrow i ji i → j i \rarr j ij 移动,这个移动是在键盘上移动的。我们不妨以 c n t [ i ] [ j ] cnt[i][j] cnt[i][j] 来表示原 s s s 中相邻的 i − j i-j ij 配对数量

那么这一位放 i i i 的贡献为:

  • ∑ j ∈ S c n t [ j ] [ i ] × ( p o s i − p o s j ) \sum_{j \in S} cnt[j][i] \times (pos_i - pos_j) jScnt[j][i]×(posiposj)
  • ∑ j ∉ S c n t [ j ] [ i ] × ( p o s j − p o s i ) \sum_{j \notin S} cnt[j][i] \times (pos_j - pos_i) j/Scnt[j][i]×(posjposi)

对于 j j j 是否已经在 S S S 中分开考虑,已经在 S S S 中的 j j j,后放置的 i i i p o s i pos_i posi 一定大于 p o s j pos_j posj,反之也很容易得出相应结论。

那么我们把贡献中包含小标 i i i 的提取出来,就变成了只和 i i i 相关的贡献:

  • ∑ j ∈ S c n t [ j ] [ i ] × p o s i \sum_{j \in S} cnt[j][i] \times pos_i jScnt[j][i]×posi
  • ∑ j ∉ S c n t [ j ] [ i ] × ( − p o s i ) \sum_{j \notin S} cnt[j][i] \times (-pos_i) j/Scnt[j][i]×(posi)

这就是 i i i 的贡献了,可以发现:把所有字母的贡献加起来,一定是这个放置顺序的答案

我们只需要从贡献这个角度切入就可以很容易得出状压 D P DP DP 的转移

时间复杂度: O ( m 2 ⋅ 2 m ) O(m^2 \cdot 2^m) O(m22m)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

const int M = 21;

int cnt[M][M];
int dp[1 << M];

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int n, m;
    std::cin >> n >> m;
    std::string s;
    std::cin >> s;
    fore(i, 1, n){
        ++cnt[s[i] - 'a'][s[i - 1] - 'a'];
        ++cnt[s[i - 1] - 'a'][s[i] - 'a'];
    }
    memset(dp, INF, sizeof(dp));
    dp[0] = 0;
    fore(S, 0, 1 << m)
        fore(i, 0, m)
            if(!(S >> i & 1)){
                int nS = S | 1 << i;
                int res = 0;
                int pos = __builtin_popcount(S);
                fore(j, 0, m){
                    if(i == j) continue;
                    if(S >> j & 1) res += cnt[i][j] * pos;
                    else res -= cnt[i][j] * pos;
                }
                dp[nS] = std::min(dp[nS], dp[S] + res);
            }
    std::cout << dp[(1 << m) - 1];
    return 0;
}

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

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

相关文章

LabVIEW热电偶自动校准系统

设计并实现一套基于LabVIEW平台的工业热电偶自动校准系统&#xff0c;通过自动化技术提高校准效率和精度&#xff0c;降低人力成本&#xff0c;确保温度测量的准确性和可靠性。 工业生产过程中&#xff0c;温度的准确测量对产品质量控制至关重要。传统的热电偶校准方式依赖人工…

昆仑万维发布天工 2.0 大语言模型及AI助手App;AI成功破解2000年前碳化古卷轴

&#x1f989; AI新闻 &#x1f680; 昆仑万维发布天工 2.0 大语言模型及AI助手App 摘要&#xff1a;昆仑万维近日推出了新版MoE大语言模型“天工 2.0”和相应的“天工 AI 智能助手”App&#xff0c;宣称为国内首个面向C端用户免费的基于MoE架构的千亿级参数大模型应用。天工…

MacOS上怎么把格式化成APFS的U盘或者硬盘格式化回ExFAT?

一、问题 MacOS在更新MacOS Monterey后或者更高系统后发现&#xff0c;格式U盘或者硬盘只有4个APFS选项&#xff0c;那么我们该如何将APFS格式成ExFAT&#xff1f; 二、解答 将APFS的U盘或者硬盘拓展成MacOS的拓展格式即可&#xff0c;操作步骤如下 1、电脑接入U盘或者硬盘 2…

从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[3…

C++ PE文件信息解析

尝试解析PE文件结构, 于是编写了此PE信息助手类, 暂时完成如下信息解析 1.导出表信息(Dll模块, 函数) 2.导入表信息(Dll模块, 函数) 3.资源表信息(字符串表, 版本信息, 清单信息) CPEHelper.h #pragma once// // brief: PE文件解析助手类 // copyright: Copyright 2024 Flame…

MySQL数据库⑦_复合查询+内外链接(多表/子查询)

目录 1. 回顾基本查询 2. 多表查询 2.1 笛卡尔积初步过滤 3. 自连接 4. 子查询 4.1 单行子查询 4.2 多行子查询 4.2 多列子查询 4.2 from子句中使用子查询 5. 合并查询 6. 内外链接 6.1 内连接 6.2 左外链接 6.2 右外连接 本篇完。 1. 回顾基本查询 先回顾一下…

51单片机编程应用(C语言):串口通信

目录 通信的基本概念和种类 1.1串行通信与并行通信 ​编辑 1.2同步通信与异步通信 1.3单工&#xff0c;半双工&#xff0c;全双工 1.4通信速率 二、波特率和比特率的关系 串口通信简介&#xff1a; 1.接口标准 RS-232 2、D型9针接口定义 3.通信协议&#xff1a; …

OCP使用web console创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 在 crc start 启动crc时&#xff0c;可以看到&#xff1a; .....…

2 月 7 日算法练习- 数据结构-树状数组上二分

问题引入 给出三种操作&#xff0c; 0在容器中插入一个数。 1在容器中删除一个数。 2求出容器中大于a的第k大元素。 树状数组的特点就是对点更新&#xff0c;成段求和&#xff0c;而且常数非常小。原始的树状数组只有两种操作&#xff0c;在某点插入一个数和求1到i的所有数的…

C++,stl,栈stack和队列queue详解

1.栈stack 1.stack基本概念 2.stack常用接口 代码示例&#xff1a; #include<bits/stdc.h> using namespace std;int main() {stack<int> stk;stk.push(7);stk.push(9);stk.push(5);cout << "栈的size为&#xff1a;" << stk.size() <…

“金龙送礼,昂首贺春”—— Anzo Capital给您送五粮液、茅台啦!

“迎龙年&#xff0c;贺新春”—— 值此龙年将至之际&#xff0c;为答谢新老客户一直以来对Anzo Capital昂首资本的信赖和支持&#xff0c;Anzo Capital昂首资本2月入金送礼活动重磅升级&#xff0c;除了京东卡、天猫超市卡、奔富红酒、SKG健康产品、白酒礼盒以外&#xff0c…

RocketMQ客户端实现多种功能

目录 RocketMQ客户端基本流程 消息确认机制 1、消息生产端采用消息确认加多次重试的机制保证消息正常发送到RocketMQ 单向发送 同步发送 异步发送 2、消息消费者端采用状态确认机制保证消费者一定能正常处理对应的消息 3、消费者也可以自行指定起始消费位点 广播消息 …

学习Pytorch深度学习运行AlexNet代码时关于在Pycharm中解决 “t >= 0 t < n_classes” 的断言错误方法

在学习深度学习的过程中&#xff0c;遇到了一个报错&#xff1a; 这跑的代码是AlexNet的代码实现。 运行时出现报错&#xff1a; C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\cuda\Loss.cu:257: block: [0,0,0], thread: [4,0,0] Assertion t > 0 && t…

[职场] 公务员面试停顿磕巴常见吗 #学习方法#知识分享#知识分享

公务员面试停顿磕巴常见吗 面试时说话磕巴简直是太常见了&#xff0c;对于一个新问题&#xff0c;让人在短时间内&#xff0c;并且仅仅是三分钟内&#xff0c;就组织起一个答案&#xff0c;还无法全部打手稿&#xff0c;这对于连上个讲台都会脸发红的人来说&#xff0c;简直是一…

前端JavaScript篇之如何获得对象非原型链上的属性?

目录 如何获得对象非原型链上的属性&#xff1f; 如何获得对象非原型链上的属性&#xff1f; 要获取对象上非原型链上的属性&#xff0c;可以使用 hasOwnProperty() 方法。这个方法是 JavaScript 内置的对象方法&#xff0c;用于检查一个对象是否包含指定名称的属性&#xff0…

TP-LINK今年的年终奖。。

TP-LINK 年终奖 如果说昨天爆料的「浦发银行年终奖&#xff0c;一书抵万金」还稍有争议&#xff08;有些说没发&#xff0c;有些说 3/4/5 折&#xff09;&#xff0c;那今天的 TP-LINK 则是毫无悬念。 据在职的 TP-LINK 技术员工爆料&#xff1a;入职时说好的 16 薪&#xff0c…

day45_maven_tomcat

今日内容 0 复习昨日 1 maven 2 tomcat 3 创建项目 0 复习昨日 1 单词写5遍 argument 参数 parameter 参数 access 访问 field 字段 invoke 调用 illegal 非法 invalid 无效 column 列 property 属性 DataSource 数据源 2 数据库连接池有啥好处 3 获得字节码文件的方式 Class.f…

ChatGPT高效提问—prompt常见用法(续篇七)

ChatGPT高效提问—prompt常见用法&#xff08;续篇七&#xff09; 1.1 零样本、单样本和多样本 ​ ChatGPT拥有令人惊叹的功能和能力&#xff0c;允许用户自由向其提问&#xff0c;无须提供任何具体的示例样本&#xff0c;就可以获得精准的回答。这种特性被称为零样本&#x…

使用CHATGPT进行论文写作的缺点和风险

为了真正感受 ChatGPT 的写作潜力&#xff0c;让我们先将其与传统的论文写作方法进行一下比较分析 CHATGPT论文写作的缺点和风险 传统论文写作的考验和磨难很深&#xff1a;费力的研究、组织想法和精心设计的逻辑论证&#xff0c;往往以牺牲你的理智为代价。 进入ChatGPT&am…

Linux下的多用户管理和认证:从入门到精通(附实例)

Linux操作系统以其强大的多用户管理和认证机制而著称。这种机制不仅允许多个用户同时登录并执行各种任务&#xff0c;还能确保每个用户的数据安全和隐私。本文将通过一系列实例&#xff0c;带你逐步掌握Linux下的多用户管理和认证。 一、Linux多用户管理的基础知识 在Linux中&…