dfs 判重Sequence one——hdu 2610

目录

前言

搜索算法判重

        map判重

        set判重

Sequence one

问题描述

输入

输出

数据范围

样例

问题分析

重构dfs参数

递减,不重复

去重的优化

最终代码


前言

搜索算法判重

        搜索算法判重有很多种方法,常见的有两种,map判重和set判重

#include<set>
#include<map>
using namespace std;

        map判重

	string s;//map判重map<string, bool>mp;if (!mp[s]) {mp[s] = true;//dfs or bfs}

        set判重

	string s;//set判重set<string>vis;if (vis.count(s) == 0) {vis.insert(s);//dfs or bfs}

但本题这两种判重都不是最佳   

    

Sequence one

问题描述

        给定一个序列,要求该序列前p个不递减的子序列,如果不足p个则输出所有

输入

        有多个测试,每个测试第一行输入两个整数n,p,分别代表序列元素个数,以及要求输出个数,第二行输入n个整数

输出

        对于每个测试输出前p个不递减的序列

数据范围

        1<n<=1000      1<p<=10000   每个整数不大于2^{31}

样例

问题分析

        本题完全可以看作一个加了很多限制的全排列问题,先附上全排列代码

//默认大家都会哈,这个应该是最简单的dfs了
void dfs(int s, int t) {if (s == t) {for (int i = 0; i < t; i++) {cout << b[i] << " ";	}cout << endl;return;}for (int i = 0; i < t; i++) {if (!vis[i]) {vis[i] = true;b[s] = a[i];dfs(s + 1, t);vis[i] = false;}}
}

        之后我们要做的就是对这段代码加上各种剪枝,使得它符合题目要求

重构dfs参数

        我们先考虑如何选择dfs函数参数问题,本题要求输出的是子序列,那么输出长度就是需要变化的,我吗命名为sublen,那么至少还需要一个参数代表我们当前递归层已经拼好的子序列长度为多少,我们命名为now_len,之后就是题目要求求不递减的子序列,那么每拼好一个整数,应该是从下一个数字开始拼,那么我们还需要一个参数,表示当前位置,命名为now_pos。到此我们就已经搭建好了基本的代码框架

void dfs(int sublen, int now_len, int now_pos){return;
}int main(){for (int i = 1; i <= n; i++) {dfs(i, 0, 1);}
}

递减,不重复

        题目说到要求递减的序列,那么就可以再每层递归前加上限制条件,而且需要使得每次生成的序列不再重复(重复的原因是因为序列中有重复的元素),那么就可以在输出序列之前判重,完整代码长这样:

//先写个单次输入的
#include<map>
#include<iostream>
using namespace std;
int n, p;
int cnt = 0;
int a[1010];
int b[1010];
map<string, bool>mp;
bool vis[1010];void dfs(int sublen,int now_len,int now_pos) {if (cnt == p) {return;}if (now_len == sublen) {string s;for (int i = 0; i < sublen; i++) {s += b[i];}//map判重if (!mp[s]) {for (int i = 0; i < sublen-1; i++) {cout << b[i] << " ";}if (sublen - 1 >= 0) {cout << b[sublen - 1] << endl;}cnt++;mp[s] = true;}return;}for (int i = now_pos; i <= n; i++) {if (!vis[i] &&  (now_len == 0 || b[now_len - 1] <=a[i])) {  //保证序列递增vis[i] = true;b[now_len] = a[i];dfs(sublen, now_len+1,i+1);//回溯vis[i] = false;}}
}int main() {cin >> n >> p;for (int i = 1; i <=n; i++) {cin >> a[i];}for (int i = 1; i <= n; i++) {dfs(i,0,1);}return 0;
}

去重的优化

        当时我也想着就这样就可以结束了,但还是超时,服了,之后才知道,这里的去重其实是可以优化的,仔细看过dfs原理图的伙伴就知道,其实dfs原理是以一个元素为首,然后不断递归去找子序列,本题导致重复的原因就是两次使用了同一个数值的元素为首进行dfs(注意我说的是同一个数值,不是同一个数)

画的有点丑,忽略

那就只需要对每层dfs的队首做一次判断即可(注意每层dfs队首都会更新),这样如果序列中有重复的元素就可以去重

f代表front——队首

最终代码

#include<iostream>
#include<set>
#include<map>
using namespace std;
int n, p;
int cnt = 0;
int a[1010];
int b[1010];
bool vis[1010];bool check(int a_ed, int a_i) {for (int i = a_ed; i < a_i; i++) {if (a[i] == a[a_i]) return false;}return true;
}void dfs(int sublen, int now_len, int now_pos) {if (cnt == p) {return;}if (now_len == sublen) {for (int i = 0; i < sublen-1; i++) {cout << b[i] << " ";}if (sublen - 1 >= 0) {cout << b[sublen - 1] << endl;}cnt++;return;}for (int i = now_pos; i <= n; i++) {if (!vis[i] && (now_len == 0 || b[now_len - 1] <= a[i])) {if (now_len == 0) {if (!check(1, i)) continue;}if (now_len != 0) {if (!check(now_pos, i))continue;}vis[i] = true;b[now_len] = a[i];dfs(sublen, now_len + 1, i + 1);vis[i] = false;}}
}int main() {while (~scanf_s("%d %d", &n, &p)) {for (int i = 1; i <= n; i++) {cin >> a[i];}cnt = 0;for (int i = 1; i <= n; i++) {dfs(i, 0, 1);}cout << endl;}return 0;
}

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

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

相关文章

linux安装mysql显示公钥尚未安装 :mysql-community-libs-8.0.39-1.el7.x86_64.rpm 的公钥尚未安装

linux安装mysql显示公钥尚未安装 mysql-community-libs-8.0.39-1.el7.x86_64.rpm 的公钥尚未安装 如题&#xff0c;当执行 yum install -y mysql-community-server 报错 解决办法 命令行执行 yum install -y mysql-community-server --nogpgcheck 也就是在原来的命令后面…

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …

120页满分PPT | 企业级业务架构和IT架构规划方案

方案内容综述 方案涵盖了从战略分析到具体实施路径的内容。提出了IT架构规划的工作思路&#xff0c;包括项目启动、部门访谈、资料收集、内部数据库搜索与先进实践研究等步骤&#xff0c;旨在通过这些步骤完成现状及差距分析&#xff0c;并基于此设计未来的应用架构、数据架构…

【java】final关键字详解

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

路由:ReactRouter

概述 一个路径path对应一个组件component 当我们在浏览器中访问一个path的时候&#xff0c;path对应的组件会在页面中进行渲染。 使用 快速开始 安装依赖 npm i react-router-dom基本使用 import { createBrowserRouter, RouterProvider } from react-router-domconst ro…

《Linux从小白到高手》理论篇:一文概览常用Linux重要配置文件

List item 今天继续宅家&#xff0c;闲来无事接着写。本篇是《Linux从小白到高手》理论篇的最后一篇了。本篇集中介绍所有常用的Linux重要配置文件。 用这个命令可以查看配置文件所在的位置&#xff1a;如上图 locate "*.conf" "*.ini" "*.cfg&quo…

Meilisearch 和 Ollama 实现文本向量搜索

Meilisearch 是一个开源、快速、简洁的全文搜索引擎&#xff0c;专为构建高性能、实时的搜索功能而设计。其主要特点如下&#xff1a; 极速搜索&#xff1a;Meilisearch 使用反向索引来加速搜索查询&#xff0c;因此能够在海量数据中提供毫秒级的响应时间&#xff0c;尤其适合实…

springboot 整合 rabbitMQ(1)

目录 一、MQ概述 二、MQ的优势和劣势 三、常见的MQ产品 RabbitMQ使用步骤 第一步&#xff1a;确保rabbitmq启动并且可以访问15672 第二步&#xff1a;导入依赖 第三步&#xff1a;配置 auto自动确认 manual手工确认&#xff08;推荐使用&#xff01;可以防止消息丢失&a…

Chromium 中js navigator对象c++实现分析

一、Navigator 对象 Navigator 对象包含有关浏览器的信息。 前端测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口测试</title> </head> <body><div id"example&q…

布局性能优化

布局使用不当回导致卡顿、掉帧、响应慢等问题 一、布局流程 1、应用侧会根据前端UI描述创建后端的页面节点树&#xff0c;其中包含了处理UI组件属性更新、布局测算、事件处理等逻辑 2、页面节点树创建完成后&#xff0c;UI线程会对每个元素进行测算&#xff08;Measure&#…

STM32中断——外部中断

目录 一、概述 二、外部中断&#xff08;Extern Interrupt简称EXTI&#xff09; 三、实例-对射式红外传感器 1、配置中断&#xff1a; 2 、完整代码 一、概述 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当…

linux下创建软链接失败

最近在研究isce to stamps,在走流程的过程中,看了b站上Dr.Liu的视频和David Bakert的manual,按照manual进行了参数的设置,接着执行了make_single_reference_stack_isce命令,但是一直报错,发现这个报错还是国庆出去旅游的时候,想着在酒店把这个问题解决掉,但是每天早出晚…

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速 2024/10/5 14:06 对于荣品RD-RK3588-AHD开发板&#xff0c;eth1位置上的PCIE转RJ458的以太网卡是默认好用的&#xff01; PCIE TO RJ45&#xff1a;RTL8111HS 被识别成为eth0了。inet addr:192.…

QT学习笔记1(QT和QT creator介绍)

QT学习笔记1&#xff08;QT和QT creator介绍&#xff09; Qt 是一个跨平台的应用开发框架&#xff0c;主要用于图形用户界面&#xff08;GUI&#xff09;应用的开发&#xff0c;但也支持非GUI程序的开发。Qt 支持多种平台&#xff0c;如Windows、macOS、Linux、iOS和Android&a…

【源码+文档+调试讲解】宜家宜业物业管理系统node.js框架

摘 要 近年来&#xff0c;科技飞速发展&#xff0c;在经济全球化的背景之下&#xff0c;互联网技术将进一步提高社会综合发展的效率和速度&#xff0c;互联网技术也会涉及到各个领域&#xff0c;而宜家宜业物业管理系统在网络背景下有着无法忽视的作用。信息管理系统的开发是…

浙江所有省级医院体检报告查询上线浙里办!

在医院完成体检后不知道什么时候出报告 体检报告出来后又要跑一次医院去拿报告 历年体检报告没保管好 往年体检报告找不到了 ………… ​编辑 为解决这些问题&#xff0c;浙江省卫生健康委结合“两卡融合、一网通办”工作的推进&#xff0c;不断丰富电子健康医保卡的功能&#…

JVS·智能BI数据可视化图表:普通列表与分组列表配置全解析

使用场景 在可视化配置中&#xff0c;很多场景中需要图形和详细信息的融合展示&#xff0c;那么在图表中可以新增普通列表与分组列表的配置。如下图所示&#xff1a; 配置说明 1、新增组件&#xff1a;配置入口如下图所示&#xff0c;新增组件时&#xff0c;选择普通列表与分…

用策略性文本序列影响大模型的输出

大型语言模型&#xff08;LLMs&#xff09;正越来越多地被集成到搜索引擎中&#xff0c;以提供针对用户查询的自然语言响应。用户也越来越依赖这些模型来做出快速而简便的购买决策。在本研究中&#xff0c;我们探讨了LLMs的推荐是否可以被操控以提升产品的可见性。 我们证明&a…

经纬恒润荣登2024北京民营企业科技创新百强榜单

9月底&#xff0c;北京市工商业联合会联合有关部门正式发布了2024年北京民营企业“14”百强榜单&#xff0c;经纬恒润凭借其在科技创新领域的卓越表现&#xff0c;再次荣获“北京民营企业科技创新百强”称号&#xff0c;彰显了公司在技术创新和研发实力方面的强劲竞争力。 此次…

《深度学习》循环神经网络RNN 结构及原理解析

目录 一、关于RNN 1、传统神经网络存在的问题 2、什么是循环神经网络 3、RNN特点 二、RNN基本结构 1、RNN基本结构 2、推导方式 注意&#xff1a; 3、循环的由来 4、RNN的局限性 一、关于RNN 1、传统神经网络存在的问题 无法训练出具有顺序的数据&#xff0c;模型搭…