【三进制状态压缩】Gym Plates

news2025/1/12 23:14:55

Problem - A - Codeforces

题意:

 

思路:

首先读完题目思路肯定就是状压+背包

但是怎么状压

这个和一般的状态压缩不太一样,每个数位的状态有三种,意味着要用三进制的状态压缩

可以这样考虑:99887766554433221100

一共是20位

对于数位7,第一个7为1表示数位7出现了2次,第2个7为1表示数位7出现了1次,两个都是1说明出现了3次

因此对于每个数位,两个都是1的状态直接是非法的,直接筛去即可

然后在转移的时候构造一个新的状态,按背包转移即可

Code:

#include <bits/stdc++.h>

using i64 = long long;

constexpr int N = 1e2 + 10;
constexpr int M = 1e2 + 10;
constexpr int P = 2e2 + 10;
constexpr i64 Inf = 1e18;
constexpr int mod = 998244353;
constexpr double eps = 1e-6;

std::vector<int> state;

int n;
i64 a[N];
i64 dp[(1 << 20)];

void solve() {
    std::cin >> n;
    for (int i = 1; i <= n; i ++) {
        std::cin >> a[i];
    }

    for (int s = 0; s < (1 << 20); s ++) {
        dp[s] = -Inf;
    }
    dp[0] = 0;

    for (int i = 1; i <= n; i ++) {
        std::vector<int> cnt(20);
        i64 u = a[i];
        while(u) {
            int num = u % 10;
            cnt[num] ++;
            u /= 10;
        }
        for (auto S : state) {
            if (dp[S] < 0) continue;
            bool ok = true;
            int nS = S;
            for (int j = 0; j < 10; j ++) {
                int c = S >> (j << 1) & 3;
                if (cnt[j] + c > 2) {
                    ok = false;
                    break;
                }else {
                    nS = (nS & ~(3 << (j << 1))) | ((c + cnt[j]) << (j << 1));
                }
            }
            if (ok) dp[nS] = std::max(dp[nS], dp[S] + a[i]);
        }
    }

    i64 ans = 0;
    for (auto S : state) {
        ans = std::max(ans, dp[S]);
    }

    std::cout << ans << "\n";
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;
    std::cin >> t;

    for (int s = 0; s < (1 << 20); s ++) {
        bool ok = true;
        for (int j = 0; j < 10; j ++) {
            if (((s >> (j << 1)) & 3) == 3) {
                ok = false;
            }
        }
        if (ok) state.emplace_back(s);
    }

    std::reverse(state.begin(), state.end());

    while (t--) {
        solve();
    }
    
    return 0;
}

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

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

相关文章

Flutter:自定义组件的上下左右弹出层

背景 最近要使用Flutter实现一个下拉菜单&#xff0c;需求就是&#xff0c;在当前组件下点击&#xff0c;其下方弹出一个菜单选项&#xff0c;如下图所示&#xff1a; 实现起来&#xff0c;貌似没什么障碍&#xff0c;在Flutter中本身就提供了弹出层PopupMenuButton组件和show…

腾讯云服务器学生怎么买?学生服务器购买指南

腾讯云服务器学生怎么买?学生服务器购买指南&#xff0c;腾讯云学生服务器优惠活动&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.…

什么是光流传感器

传感器 文章目录 传感器前言一、光流传感器二、px4FLOW 前言 光流利用的是图像的变化处理&#xff0c;用于检测地面的状态&#xff0c;从而监测飞机的移动&#xff1b;主要用于保持飞机的水平位置&#xff0c;以及在室内实现定高和定点飞行。 其实光流是数字图像处理理论的一部…

学乐多光屏学习机:教育智能硬件领域的前沿力量

在当今数字化时代&#xff0c;教育方式正经历着巨大的变革&#xff0c;智能硬件为教育领域带来了前所未有的机遇和挑战。学乐多光屏学习机作为一款创新的教育智能硬件产品&#xff0c;以其独特的特点和优势&#xff0c;引领着学习机领域的发展潮流。 1. 多功能融合&#xff1a…

使用MATLAB解算炼油厂的选址

背景 记得有一年的数据建模大赛&#xff0c;试题是炼油厂的选址&#xff0c;最后我们采用MATLAB编写&#xff08;复制&#xff09;蒙特卡洛算法&#xff0c;还到了省级一等奖&#xff0c;这里把仅有一些记忆和材料&#xff0c;放到这里来&#xff0c;用来纪念消失的青春。 本…

Creo结构设计-弧形实体绘制/两个实体的圆滑连接-轨迹扫描

实际需求&#xff1a; 在很多场景需要建模不同弧度的实体对象&#xff0c;常见的依据横截面进行拉伸操作无法很好的完成&#xff0c;有什么样的操作能够方便完成弧形实体建模&#xff1f; 解决方式&#xff1a; 采用轨迹扫描操作完成 举例1&#xff1a;例如两个垂直的圆柱&…

【OpenCV入门】第一部分——图像处理基础

本文结构 图像处理的基本操作读取图像imread() 显示图像imshow()waitKey()destroyAllWindows() 保存图像imwrite() 获取图像属性 像素确定像素的位置获取像素的BGR值修改像素的BGR值 色彩空间GRAY色彩空间cvtColor()——从BGR色彩空间转换到GRAY色彩空间 HSV色彩空间从BGR色彩空…

根据逻辑分析仪实际波形,解析IIC通信及可能出现的问题(从机控制时钟SCL)

1、通信是信息的传递 1.1、信息 信息是多种多样的&#xff0c;在数字电路中&#xff0c;最基本的信息是高低电平&#xff0c;高低电平的提供需要电路转化的&#xff0c;维持高/低是要消耗能量的&#xff0c;信息需要借助能量来存在。 1.2、传递 从发送端传递到接收端需要媒…

【复杂网络建模】——ER网络和SF网络的阈值分析

目录 1、介绍ER网络和SF网络 2、计算网络阈值 2.1 ER&#xff08;Erdős-Rnyi&#xff09;网络 2.2 SF&#xff08;Scale-Free&#xff09;网络 3、 研究网络阈值的意义 1、介绍ER网络和SF网络 在复杂网络理论中&#xff0c;ER网络&#xff08;Erdős-Rnyi网络&#xff…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

数据库备份和Shell基础测试及AWK(运维)

第一题&#xff1a;简述一下如何用mysql命令进行备份和恢复&#xff0c;请以test库为例&#xff0c;创建一个备份&#xff0c;并再用此备份恢复备份 备份步骤&#xff1a; 备份test库&#xff1a;使用mysqldump命令备份test库&#xff0c;并将备份写入一个.sql文件中。命令示例…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

〖Python网络爬虫实战㉞〗- 图形验证码OCR识别

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

操作系统_文件管理(三)

目录 3. 文件系统 3.1 文件系统结构 3.2 文件系统布局 3.2.1 文件系统在磁盘中的结构 3.2.2 文件系统在内存中的结构 3.3 外存空闲空间管理 3.3.1 空闲表法 3.3.2 空闲链表法 3.3.3 位示图法 3.3.4 成组链接法 3.4 虚拟文件系统 3.5 分区和安装 3.6 小结 3. 文件系…

Javaweb入门

Spring Spring发展到今天已经形成一种开发生态圈&#xff0c;Spring提供若干个子项目&#xff0c;每个项目用于完成特定的功能。 Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 SpringBootWeb入门 需求&#xff1a;使用Spring Boot开发一个web应用&a…

不同代码写法的区别

目录 神经网络中输入在layer中写输入在build中写输入 输出format写法f代替format写法 zip不加*加* 打平Flatten方法reshape方法 数据打包(batch)tensorflowpytorch 神经网络中输入 在layer中写输入 layers.Dense(512, activationrelu, namelayer1,input_shape(784,)),此处784…

C语言 实现atoi函数

实现类似atoi函数&#xff0c;把字符串“123456”转换成数值123456 函数int atoi(char *str); 使用ubuntu进行多文件编译&#xff08;main.c head.h test.c&#xff09; head.h&#xff08;预处理&#xff09; #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.…

freertos之信号量

介绍 信号量这个名字很恰当&#xff1a; 信号&#xff1a;起通知作用 量&#xff1a;还可以用来表示资源的数量 当"量"没有限制时&#xff0c;它就是"计数型信号量"(Counting Semaphores) 当"量"只有0、1两个取值时&#xff0c;它就是"二进…

2023必备AIGC人工智能软件Top 6

随着人工智能技术的迅猛发展&#xff0c;越来越多的应用程序开始集成AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;人工智能生成内容&#xff09;功能&#xff0c;为用户提供更高效、更创造性的体验。在本文中&#xff0c;我们将分享6款实用的AIGC软…

C++ DAY7

一、类模板 建立一个通用的类&#xff0c;其类中的类型不确定&#xff0c;用一个虚拟类型替代 template<typename T> 类template ----->表示开始创建模板 typename -->表明后面的符号是数据类型&#xff0c;typename 也可以用class代替 T ----->表示数据类型…