【状态设计优化DP】P4310 绝世好题

news2024/12/27 18:10:12

不愧是绝世好题

和abc那道E一样,也是重新定义状态来优化转移复杂度的DP

(56条消息) Atcoder Beginner Contest E - Work or Rest_lamentropetion的博客-CSDN博客

这种其实就是通过转移方式的特殊性来设计状态,从而降低复杂度

其实我感觉降低复杂度优化就是因为某个地方比较特殊,然后根据这个特殊性来优化

还有一点就是关于子序列的DP一般都以a[i]结尾来定义

这题是我做过的唯一线性DP设计状态的时候没加阶段的DP了,所以有点哈希内味

这种DP妙妙题我还没怎么写过,只会笨笨的那种DP,感觉得多写这种DP了

P4310 绝世好题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

思路:

首先就是每个人都会的暴力DP,像LIS那样,这样是n^2的,显然T飞了

我们来重新设计状态

考虑它的转移方式:当且仅当某一位两个数该位都是1时转移,因此我们定义dp[i]为最后一个数的第i位为1的最长长度

在加入某个数之前,我们遍历位统计出此时dp[i]的最大值

然后在加入这个数之后来转移

加入这个数之后,所有位都变成了那个统计出来的最大值+1,这样就转移好了

Code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=1e5+10;
int n;
int a[mxn],dp[32];
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        int mx=-1;
        for(int j=30;j>=0;j--){
            if((a[i]>>j)&1) mx=max(mx,dp[j]);
        }
        for(int j=30;j>=0;j--){
            if((a[i]>>j)&1) dp[j]=max(dp[j],mx+1);
        }
    }
    int mx=-1;
    for(int j=30;j>=0;j--) mx=max(mx,dp[j]);
    cout<<mx<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

总结:

怎么去定义状态:

考虑转移方式,根据转移方式的特殊性来定义状态

这道题在设计状态时没有考虑阶段,所以有点哈希的感觉,我愿称之为哈希DP(bushi

还有一点就是关于子序列的DP一般都以a[i]结尾来定义

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

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

相关文章

数据结构——括号匹配问题

这是一道常见的经典的数据结构中栈的问题。题目&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;我们运用C语言实现这个问题。有效括号调用栈由于要涉及到栈的问题&#xff0c;不可避免的要运用栈的函数接口。比较直接的方法是&#xff0c;直接复制 栈 的代…

通过windows程序计划设定nginx开机自启动

通过windows程序计划设定nginx开机自启动1、按下win键输入计划&#xff0c;回车2、找到windows目录&#xff0c;在当下目录创建新任务3、自定义名称描述4、将触发设定为开机自启动5.点击下一步&#xff0c;程序或脚本选择nginx.exe所在目录&#xff0c;要把下面的起始于 处填上…

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值…

《Linux Shell脚本攻略》学习笔记-第十一章

11.1 简介 本章将会讲述如何获取相关网络分组。CPU占用率、磁盘使用情况以及东台调用的更多信息。 11.2 使用tcpdump跟踪分组 tcpdump需要以root身份运行。 关键字port可以只显示出发往或者来自特定端口的分组 src修饰符配合特定的“关键字-值”就可以指定源文件中的这类分组。…

Linux chown 命令

Linux chown&#xff08;英文全拼&#xff1a;change owner&#xff09;命令用于设置文件所有者和文件关联组的命令。Linux/Unix 是多人多工操作系统&#xff0c;所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组&#xff0c;用户可以是用户名或者用户 …

基于机器学习 实现APT 检测(附完整代码)

项目环境概述以机器学习的方式&#xff0c;可以通过多种模型对 APT 组织所使用的恶意代码进行训练学习&#xff0c;同时由于训练的多样化&#xff0c;检测效果也会比家好。本项目采用的随机森林以及不同采样策略进行模型训练。详细设计见md文件。1.系统描述本系统主要是针对大量…

ElementUI中树形表格下拉卡死的问题解决

文章目录错误现象与描述&#xff1a;代码案例&#xff1a;错误现象与描述&#xff1a; 最近在修改一个前端的问题&#xff0c;发现后台返回给前端有数据&#xff0c;SQL查询也很快&#xff0c;但是就是前端的表格这里一直卡死&#xff0c;后来发现其他数据正常&#xff0c;其中…

【代码随想录】343. 整数拆分

343. 整数拆分 动态规划五部曲 1. 确定dp数组以及下标的含义 dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 2. 确定递推公式 其实可以从1遍历j&#xff0c;然后有两种渠道得到dp[i]. 一个是j * (i - j) 直接相乘。 一个是j * dp[i - j]&#xff0c;相…

文本向量化

1、one-hot 在one-hot里面每一个token用一个长度为N向量表示&#xff0c;N表示的是词典的数据量。&#xff08;不重复的词数量&#xff09; 缺点&#xff1a;维度太高&#xff0c;用稀疏向量表示文本。 2、word embedding 使用float的矩阵来表示token&#xff0c;根据词典的…

Qt环境生成dump文件解决程序异常崩溃以及生成日志文件

一、背景 1、在测试自己的项目代码过程 ① 程序的编译的时候没有报错&#xff0c;程序在Qt release模式下运行程序&#xff0c;程序运行五个小时后异常退出&#xff0c;The process was ended forcefully&#xff1b;② 以及在项目程序通过windeployqt 工具打包发布的程序&am…

用最简单的方式告诉你什么是集线器、交换机、路由器

欢迎来到东用知识小课堂&#xff01;某一天&#xff0c;你到你女友小芳(暂定这个名字吧)就读的学校去找她&#xff0c;那么你的做法是什么呢&#xff1a;一、集线器的工作方式&#xff1a;你站到学校中庭&#xff0c;大喊一声“小芳&#xff0c;我来你找你了!”(广播)如果这个时…

〖百宝书-思维锻炼①〗——思维进阶和升华

大家好&#xff0c;我是涵子&#xff0c;欢迎大家今天进入了新专题&#xff1a;百宝书-思维锻炼&#xff01; &#x1f4ac; 人生格言&#xff1a;Stay foolish, stay kind.&#x1f4ac; &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学…

SpringSecurity随笔(2)-OAuth2协议

短信登录 参考密码登录过程 1.编写短信登录过滤器&#xff0c;验证短信验证码 2.编写未认证得SmsAuthenticationToken 3.将未认证的SmsAuthenticationToken传递给AuthenticationManager 4.编写一个SmsAuthenticationProvider 5.调用UserDetialsService获取用户信息 OAuth协议…

【Linux杂篇】经常登录Linux,用户密码背后的知识了解一下

一&#xff0c;用户密码存放在哪里&#xff1f; 说到这个问题&#xff0c;绝大部分的同学肯定都知道/etc/passwd这个文件&#xff0c;不错&#xff0c;这个文件里存储的就是用户名&#xff0c;密码等信息。 每一行都是一个account&#xff0c;每一行有7个信息&#xff0c;分…

在农业银行做开发是什么样的体验?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

MySQL环境搭建

文章目录1. MySQL的卸载步骤1&#xff1a;停止MySQL服务步骤2&#xff1a;软件卸载步骤3&#xff1a;残余文件的清理步骤4&#xff1a;清理注册表步骤5&#xff1a;删除环境变量配置2. MySQL的下载、安装、配置MySQL的4大版本软件的下载MySQL8.0 版本的安装配置MySQL8.0配置MyS…

超详解通讯录,保姆式教学 ,轻松学会实现通讯录的功能【c语言】

文章目录静态通讯录Contact.htest.c菜单的创建Contact.c初始化通讯录InitContact的实现增加联系人AddContact的实现查找指定联系人的信息SearchContact的实现删除指定联系人DelContact的实现修改指定联系人的信息ModifyContact的实现显示所有联系人的信息ShowContact的实现完整…

vite项目为什么可以直接使用NODE_ENV?

背景 我们知道&#xff0c;在process.env中并没有NODE_ENV这个变量&#xff0c;但是我们却可以在项目的代码中使用process.env.NODE_ENV这个值来判断当前是development环境还是production环境&#xff0c;然后进行后续的逻辑操作。 这说明&#xff0c;在vite内部&#xff0c;…

大数据面试题集锦-Hadoop面试题(二)-HDFS

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题&#xff0c;关注一下"张飞的猪大数据分享"吧&#xff0c;公众号会不定时的分享相关的知识和资料。 1、 HDFS 中的 block 默认保存几份&#xff1f; 默认保存…

MacBook Pro外接显示器竖屏显示

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3;哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d;一位上进心十足的【Java ToB端大厂领…