数位翻转(dp)

news/2025/1/6 19:18:09/文章来源:https://www.cnblogs.com/shen-kong/p/18652136

给一 n 个数字的数组, 一个翻转操作将一个数按二进制形式翻转再转回十进制. 问最多翻转 m 个连续段, 完成后数组和最大为多少.
先求贡献数组(翻转后能增加多少), 然后问题转化为数组中选 m 个段和最大, 这和最大连续子数组和是不同的(只有一个段).

定义
\(dp[i][j][0] 代表在递推到第 i 个时, 已经分了 j 段, 不选a[i], 最大的和\)
\(dp[i][j][1] 代表在递推到第 i 个时, 已经分了 j 段, 选a[i], 最大的和\)

可知若求出了 \(递推到第 i 个时, 已经分了 j 段最大的和\) , 第 i + 1 个可以选或者不选
不选的话就是
\(dp[i + 1][j][0] = max(dp[i][j][0], dp[i][j][1])\)
选的话就是
\(dp[i + 1][j][1] = max(dp[i][j - 1][0], dp[i][j][1]) + a[i]\)

最后要返回递推到第n个时分(1 ~ m)段最大的那个 ans = max(ans, dp[n][i][0], dp[n][i][1])

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned int;
using i128 = __int128;
#define TEST 
#define TESTS int _; cin >> _; while(_--)
using namespace std;
int n, m;
i64 a[4000];
i64 dp[4000][4000][2];
i64 flip(int n) {i64 num = 0;while(n) {num = num * 2 + (n % 2);n /= 2;}return num;
}
void Main() {cin >> n >> m;i64 sum = 0;for(int i = 0; i < n; ++i) {i64 num;cin >> num;sum += num;a[i + 1] = flip(num) - num;}for(int i = 1; i <= n; ++i) {for(int j = 1; j <= m; ++j) {dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1]);dp[i][j][1] = max(dp[i - 1][j][1], dp[i - 1][j - 1][0]) + a[i];}}i64 ans = 0;for(int i = 1; i <= m; ++i) ans = max({ans, dp[n][i][0], dp[n][i][1]});cout << ans + sum << endl;
}
int main() {ios :: sync_with_stdio(false);cin.tie(0); cout.tie(0);TEST Main();return 0;
}

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

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

相关文章

机房轶事_2

机房轶事_2 之前 机房某同学的Luogu账号被另一个同学破解了密码,并且把头像改成了遗照(配花环)。 更过分的是,他居然将封面改成了教练的照片。

20241403《计算机基础与程序设计》课程总结

20241403《计算机基础与程序设计》课程总结 每周作业链接汇总 第一周作业: 【内容概要】课程概论第二周作业: 【内容概要】①数字化 ②信息安全 ③自学教材第三周作业: 【内容概要】①掌握门和电路 ②学习计算机部件 ③了解冯诺依曼体系结构 ④学习C语言基础知识,第四周作业…

AutoGeaconC2:一款一键读取Profile自动化生成geacon实现跨平台上线CobaltStrike

CobaltStrike是渗透测试中常用的一款基于C2框架的攻击工具。生成Windows payload也很方便。 但在CobaltStrike中如何上线Linux设备呢❓ AutoGeaconC2是一款一键读取Profile自动化生成geacon实现跨平台上线CobaltStrike。目前仅支持Linux amd64上线。 使用 首先下载releases中的…

Nginx-克隆备份虚拟机

克隆备份虚拟机 选中要备份的虚拟机 - 管理 - 克隆 开机状态下 没有办法克隆关机 init 0下一页克隆当前状态选择 创建链接克隆克隆名称 位置完成克隆

activiti6.0.0 二次开发兼容达梦数据库(亲测有效)

一、 前因 最近公司做数据库国产化,数据从MySql数据库中迁移到达梦(DM8),在迁移过程中,当迁移工作流(Activiti6.0.0)时,提换达梦(DM8)数据库驱动后启动过程报错: Caused by: org.activiti.engine.ActivitiException: couldnt deduct database type from database pr…

MYSQL中Join的用法.240430

1、笛卡尔积(没有加筛选条件的内连接) 两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来。 mysql> select * from t1 join t2;或者 mysql> select * from t1 inner join t2;或者 mysql> select * from t1, t2;2、左连接 两表关联,左表全部保留,右表关联不…

idea左上角project一片绿的解决方法.240712

idea突然project底色一片绿,真的心里慌得一批。。解决方法: 打开File-Settings,按图示找到地方,关闭FileColor,即可。.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0…

PCS7 笔记

400H和410H400H系统属于老版本CPU,在售的越来愈少。410H作为400H的替代和更新产品出现。冗余机制同步周期同步 事件同步:在西门子400H/410H cpu中,两个CPU内部的数据,必须保持高度统一,属于西门子冗余PLC的专利,西门子冗余均为事件同步。在西门子400H/410H冗余PLC中,不推…

2024-2025-1 20241411王思棋《计算机基础与程序设计》课程总结

每周作业链接汇总 第一周作业:基于VirtualBox安装Ubuntu,从而安装Linux系统。快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题第二周作业:数字化、信息安全第三周作业:数字分类与计数法、位置计数法、进制…

Verilog2_硬件描述语言

Verilog内容总结2_硬件描述语言一、硬件描述语言概述 1.主要的硬件描述语言VHDL(VHSIC HDL): 天然支持并发描述,允许在同一个文件中定义多个并发执行的进程;可读性和可维护性较好,适合于大型项目和团队合作;支持用户定义的数据类型;可以使用抽象类型为系统建模 Verilog…

Nginx-CentOS设置网卡配置固定IP地址

一、未设置网卡前 唔怕ping通网络二、ip addr 查看网络配置 ip addr三、修改 ifcfg-ens33 配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 四、ONBOOT = no 改为 yes (启动操作系统后一并启动网卡)五、重启网卡 systemctl restart network 此时再去ping qq.com的话…