当前位置: 首页 > news >正文

【Lanqiao】数位翻转

题目:

思路:

写蓝桥不能不写dp,就像....

 题目数据给的不大,所以我们可以考虑一种 n*m 的做法,那么对于这种题目可以想到的是用dp来写,但是如何构造转移方程与状态是个难事

由于这题对于任意一个数我们有两种可能,即翻转or不翻转,那么肯定要有一维代表这个,同时我们还有一个数m,我们可以决定一共翻转m个,所以还可以用一维表示这个,那么我们就能想到一个暴力的dp,我们定义 dp[i][j][k] 为前 i 个数一共翻转了 j 个区间且当前数是否翻转了

对于 dp[i][j][0],即当前没翻转,那么可以从哪里转移呢?显然只有两种转移,即 dp[i-1][j][0] 和 dp[i-1][j][1] ,因为我们没翻转,所以选的区间数不会变,但是上一个数可以翻转or不翻转

对于 dp[i][j][1],即我们此刻翻转,那么就有两种情况,一个是前面翻转了,一个是前面没反转,如果前面没翻转,那么就是 dp[i-1][j-1][0],因为我们此刻增加了一个新的翻转区间,所以是 j - 1,如果前面翻转了,那么就还分两种情况:接着上一个区间,那就是 dp[i-1][j][1],此时新开一个区间,那就是 dp[i-1][j-1][1],不够按理来说第二种是不会出现的,明显不优

至此我们讨论完毕,然后dp即可,我们这里可以将转移方程中的转移的奉献变为 b[i] - a[i],这样的话能少写一点,并且更直观,具体看代码

(还学到了max可以用花括号一次max好几个元素)

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
#define PII pair<int,int>int a[1005];
int b[1005];
//题目说的操作
int f(int x)
{int res = 0;int mxbit = 0;for (int i = 31; i >= 0; i--){if ((x >> i) & 1){mxbit = i;break;}}for (int i = 31; i >= 0; i--){if ((x >> i) & 1){res += 1LL << (mxbit - i);}}return res;
}
//前i个数 翻转了j个区间 且第i位 翻or不翻 转
int dp[1005][1005][2];
void solve()
{int n, m;cin >> n >> m;int res = 0;for (int i = 1; i <= n; i++){cin >> a[i];b[i] = f(a[i]) - a[i];res += a[i];}memset(dp, 0, sizeof(dp));for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){dp[i][j][0] = max(dp[i - 1][j][1], dp[i - 1][j][0]);dp[i][j][1] = max({ dp[i - 1][j - 1][0],dp[i - 1][j][1],dp[i - 1][j - 1][1] }) + b[i];}}int mx = 0;//枚举选多少个区间 ifor (int i = 1; i <= m; i++){mx = max({ mx,dp[n][i][0] ,dp[n][i][1] });}cout << res + mx;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

http://www.xdnf.cn/news/325999.html

相关文章:

  • 2021年下半年试题四:论微服务架构及其应用
  • SQL Server 中的 GO 及其与其他数据库的对比
  • Spark-Core(双Value类型)
  • C++对象注册系统(1)实现原理
  • 应用 | AI 自动化某讯会议转录与摘要生成系统
  • Android开发-视图基础
  • Facebook的元宇宙新次元:社交互动如何改变?
  • 2021年CVPR文章【Polygonal Building Segmentation by Frame Field Learning】环境搭建
  • 《Python星球日记》 第47天:聚类与KMeans
  • Kotlin zip 函数的作用和使用场景
  • 镜像和容器的管理
  • Qwen2.5模型结构
  • QT编程练习20250507
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.1 主流可视化工具对比(Tableau/Matplotlib/Python库)
  • FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法
  • 算法专题四:前缀和
  • 【北京迅为】iTOP-4412精英版使用手册-第八章 Android 4.4系统编译
  • neo4j多跳查询,未只获取到收尾两个节点,待继续
  • 智能运维实战|数据库卡慢处置的一次关键事件
  • 尚硅谷-硅谷甄选项目记录
  • Facebook隐私设置详解:如何保护你的个人信息
  • 【漫话机器学习系列】245.权重衰减(Weight Decay)
  • SR触发器为什么能够消抖
  • Vue 项目中长按保存图片功能实现指南
  • AI大模型基础设施:NVIDIA GPU和AMD MI300系列的区别
  • android 记录应用内存
  • Scaffold-DbContext详解
  • 如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?
  • 2025FIC初赛(手机)
  • JAVA中ArrayList的解析