左神:高级进阶班4

news2024/12/23 11:04:58

1.让N个人过河所需最少船​编辑

2.最长回文子序列

3.最少添加字符让字符串变回文串​编辑

4.回文子串的最少切割次数

5.移除字符使字符串变回文串的方案数​编辑


1.让N个人过河所需最少船

思路:
    1.排序数组,用基数排序(元素(体重)大小范围有限)
    2.找到(limit/2)最右的位置index
      2.1 index==-1,如果元素全都是大于(limit/2)的,至少需要N条船
      2.2 index==arr.size(),如果元素全都是小于(limit/2)的,至少需要N/2条船
    
void radixSort(vector<int>& arr) {
	vector<vector<int>>bucket(10,vector<int>(arr.size()));//二维数组-桶,每个桶就是一个一维数组
	int bucketElementCounts[10] = { 0 };//每个桶里的数据容量
	int max = 0;//待排序数组的最大值
	for (int i = 0; i < arr.size(); i++) {
		if (arr[i] > max) {
			max = arr[i];
		}
	}
	int m_digit = 0;//待排序数组的最大位数
	while (max > 0) {
		m_digit++;
		max /= 10;
	}

	for (int j = 0, n = 1; j < m_digit; j++, n *= 10) {
		for (int k = 0; k < arr.size(); k++) {
			//取出每个元素对应位的值
			int digit = (arr[k] / n) % 10;

			//放入到对应桶中
			bucket[digit][bucketElementCounts[digit]] = arr[k];
			bucketElementCounts[digit]++;
		}

		//按照桶的顺序(一维数组的下标)依次取出数据放回原数组中
		int index = 0;
		for (int l = 0; l < 10; l++) {
			//如果桶中有数据才放入数组
			if (bucketElementCounts[l] != 0) {
				for (int m = 0; m < bucketElementCounts[l]; m++) {
					arr[index] = bucket[l][m];
					index++;
				}
			}
			//为了模拟桶的数据被取出,我们需要将桶中的数据容量清空
			bucketElementCounts[l] = 0;
		}
	}
}

int minBoat(vector<int>arr, int limit) {
	if (arr.size() == 0)return 0;
	radixSort(arr);
	
	if (arr[arr.size() - 1] < (limit / 2))return (arr.size()+1) / 2;//需要向上取整
	if (arr[0] > (limit / 2))return arr.size();
	int lessR = -1;
	for (int i = arr.size()-1; i >= 0; i++) {
		if (arr[i] <= (limit / 2)) {
			lessR = i;
			break;
		}
	}
	
	int L = lessR;
	int R = lessR + 1;
	int lessUnused = 0;
	while (L >= 0) {
		int solved = 0;
		while (R < arr.size() && arr[L] + arr[R] <= limit) {//贪心
			R++;
			solved++;
		}
		if (solved == 0) {
			lessUnused++;
			L--;
		}
		else {
			L = max(-1, L - solved);
		}
	}
	int lessAll = lessR + 1;
	int lessUsed = lessAll - lessUnused;
	int moreSolved = arr.size() - lessR - 1 - lessUsed;
	return lessUsed + ((lessUnused + 1) >> 1) + moreSolved;
}

2.最长回文子序列

int lcse(string str) {
	if (str.length() == 0)return 0;
	vector<vector<int>>dp(str.length(), vector<int>(str.length()));

	for (int i = 0; i < str.length(); i++) {
		dp[i][i] = 1;
	}
	for (int j = 0; j < str.length()-1; j++) {
		dp[j][j + 1] = str[j] == str[j + 1] ? 2 : 1;
	}

	for (int i = str.length() - 2; i >= 0; i--) {
		for (int j = i + 2; j < str.length(); j++) {
			dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);
			if (str[i] == str[j]) {
				dp[i][j] = max(dp[i][j], dp[i + 1][j - 1] + 2);
			}
		}
	}
	return dp[0][str.length() - 1];
}

3.最少添加字符让字符串变回文串

dp[i][j]:至少添几个字符才能让str[i...j]变成回文串
vector<vector<int>>getDp(string str) {
	vector<vector<int>>dp(str.length(), vector<int>(str.length()));
	for (int j = 1; j < str.length(); j++) {
		dp[j - 1][j] = str[j] == str[j - 1] ? 0 : 1;
		for (int i = j - 2; i > -1; i--) {
			if (str[i] == str[j]) {
				dp[i][j] = dp[i + 1][j - 1];
			}
			else {
				dp[i][j] = min(dp[i + 1][j], dp[i][j-1])+1;
			}
		}
	}
	return dp;
}

string getPalindrome(string str) {
	if (str.length() < 2)return str;
	vector<vector<int>>dp = getDp(str);
	string res(str.length() + dp[0][str.length() - 1], '\0');
	int i = 0;
	int j = str.length() - 1;
	int resl = 0;
	int resr = res.length() - 1;
	while (i <= j) {
		if (str[i] == str[j]) {
			res[resl++] = str[i++];
			res[resr--] = str[j--];
		}
		else if (dp[i][j - 1] < dp[i + 1][j]) {
			res[resl++] = str[j];
			res[resr--] = str[j--];
		}
		else {
			res[resl++] = str[i];
			res[resr--] = str[i++];
		}
	}
	return res;
}

4.回文子串的最少切割次数

vector<vector<bool>>record(string str) {
	vector<vector<bool>>record(str.length(), vector<bool>(str.length()));
	record[str.length() - 1][str.length() - 1] = true;
	for (int i = 0; i < str.length() - 1; i++) {
		record[i][i] = true;
		record[i][i + 1] = str[i] == str[i + 1];
	}
	for (int row = str.length() - 3; row >= 0; row--) {
		for (int col = row + 2; col < str.length(); col++) {
			record[row][col] = str[row] == str[col] && record[row + 1][col - 1];
		}
	}
	return record;
}

int minCut(string str) {
	if (str.length() < 2)return str.length();
	int len = str.length();
	vector<int>dp(len + 1);
	dp[len] = 0;//防溢出
	dp[len - 1] = 1;
	vector<vector<bool>>p = record(str);
	for (int i = len - 1; i >= 0; i--) {
		dp[i] = str.length() - i;
		for (int j = i; j < len; j++) {
			if (p[i][j]) {
				dp[i] = min(dp[i], dp[j + 1] + 1);
			}
		}
	}
	return dp[0] - 1;
}

 5.移除字符使字符串变回文串的方案数

dp[i][j]:把以下所有可能性都要算上
(1)以i,以j
(2)不以i,以j
(3)不以i,不以j
(4)以i,不以j
dp[i][j-1]=(3)+(4)
dp[i+1][j]=(2)+(3)
dp[i+1][j-1]=(3)

(2)+(3)+(4)=dp[i][j-1]+dp[i+1][j]-dp[i+1][j-1]
(1)=str[i]==str[j],dp[i+1][j-1]+1

int ways(string str) {
	int n = str.length();
	vector<vector<int>>dp(str.length(), vector<int>(str.length()));
	for (int i = 0; i < n; i++) {
		dp[i][i] = 1;
		if (i + 1 < n && str[i] == str[i + 1]) {
			dp[i][i + 1] = 3;
		}
		else {
			dp[i][i + 1] = 2;
		}
	}
	for (int p = 2; p < n; ++p) {
		for (int i = 0, j = p; j < n; ++i, ++j) {
			if (str[i] == str[j]) {
				dp[i][j] = dp[i + 1][j] + dp[i][j - 1] + 1;
			}
			else {
				dp[i][j] = dp[i + 1][j] + dp[i][j - 1] + dp[i + 1][j - 1];
			}
		}
	}
	return dp[0][n - 1];
}

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

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

相关文章

计算机毕设Python+Vue学生信息管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

推特群推营销解读

推特群推王发现&#xff0c;许多品牌使用社交媒体作为提供更好客户支持的一种渠道。使用社交媒体可以实时响应客户的需求。通过电子邮件获取品牌有时可能需要长达48小时。但是&#xff0c;通常在社交媒体上回应的时间要快得多。客户将通过你的品牌发推文&#xff0c;你将在手机…

被动与主动信息收集 | 系统性学习 | 无知的我费曼笔记

文章目录信息收集-被动信息收集介绍收集手段收集内容信息用途信息收集-域名解析过程以手段域名解析过程信息收集 DNS**DNS 信息收集-NSLOOKUP****DNS 信息收集-DIG****查询网站的域名注册信息和备案信息**信息收集-被动信息收集手段大全**使用 Maltego 收集子域名信息**子域名介…

【论文简述】PatchmatchNet: Learned Multi-View Patchmatch Stereo(CVPR 2021)

一、论文简述 1. 第一作者&#xff1a;Fangjinhua Wang 2. 发表年份&#xff1a;2021 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、深度学习、Patchmatch、自适应、迭代优化 5. 探索动机&#xff1a;可扩展性、时间、内存占用等效率问题依然没有解决。 While…

【电气安全】关于医疗专用隔离电源系统在医院配电系统中的应用

【摘要】 根据医疗场所分类说明医院尤其是 2 类 医疗场所的接地方案&#xff0c;分析医疗场所自动切断电源措 施&#xff0c;提出校验医疗 IT 系统配出回路长度&#xff1b;说明 RCD、RCM、IMD、IFLS 等的用途和范围&#xff1b;就应急医 院 2 类场所的配电方案进行探讨。 【…

JavaScript刷LeetCode拿offer-双指针技巧(上)

一、前言 一般情况下&#xff0c;遍历数组&#xff08;或者字符串&#xff09;操作&#xff0c;都是采用单指针从前往后或者从后往前依次访问数组&#xff08;或者字符串&#xff09;中的元素。 而对于以下情况&#xff0c;只采用单指针处理&#xff0c;则会徒增时间复杂度和…

统计学习方法 | 概论

一.简介 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科 1.统计学习方法的步骤 ①得到一个有限的训练数据集合 ②确定学习模型的集合&#xff08;模型&#xff09; ③确定模型选择的准则&#xff08;策略&#xff09; ④实现求解…

Python的安装与配置(图文教程)

安装Python 想要进行Python开发&#xff0c;首先需要下载和配置Python解释器。 下载Python 访问Python官网: https://www.python.org/点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python安装Python 双击下载好的Python…

五款几乎没人知道的小众软件,按需下载

分享是一种神奇的东西&#xff0c;它使快乐增大&#xff0c;它使悲伤减小&#xff0c;坚持分享一些好用的软件给大家。 1.开源分享工具——ShareX ShareX 是一款 Windows 上开源的截图、文件共享和生产力工具&#xff0c;它是一款功能非常强大的分享工具&#xff0c;只要是免…

【算法】可解释机器学习-ZFNet(Datawhale)

可解释机器学习-ZFNetZFNet算法介绍&#xff1a;AlexNet的提出使得大型卷积网络开始变得流行起来&#xff0c;但是人们对于CNN网络究竟为什么能表现这么好&#xff0c;以及怎么样能变得更好尚不清楚。 因此为了解决上述两个问题&#xff0c;ZFNet提出了一种可视化技术&#xff…

如何治理谐波问题?——有源滤波器

安科瑞 华楠 一、谐波的定义 任何一种周期性非正弦波形都可以看成是由若干种频率不同的正弦波合成的&#xff0c;其中频率为工频的波形我们称为基波&#xff0c;大于1 整数倍基波频率的正弦波分量称为谐波。 总谐波畸变由不同频率的分次谐波合成&#xff0c;各次谐波频率与基…

asp写的百度ocr识别文字-通用文字识别(高精度版)源码下载

今天接到一个客户需求&#xff0c;需要用ASP写一个百度OCR文字识别代码&#xff0c;他的程序都是用ASP写的&#xff0c;所以我们也需要用ASP给他实现百度OCR文字识别&#xff0c;我们在百度AI网站上启用了通用文字识别高精度版&#xff0c;利用高精度板来实现它的业务需求。在上…

【C++】泛型编程 _函数模板和类模板的基本使用

1.泛型编程 如何实现一个通用的交换函数&#xff1f;这在C语言中是无法实现的&#xff0c;但是C却可以。 C语言一次只能实现一个类型的交换&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, …

计算机毕设Python+Vue学生信息管理系统 (程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

关于小程序订单中心页设置的公告

为进一步规范小程序交易生态、提升用户购物体验、满足用户在有交易的小程序中便捷查看订单信息的诉求&#xff0c;自2022年12月31日起&#xff0c;对于有“选择商品/服务-下单-支付”功能的小程序&#xff0c;需按照平台制定的规范&#xff0c;在小程序内设置订单中心页。 开发…

创建DataFrame()对象--Pandas

1. DataFrame DateFrame对象是Pandas最常用的数据结构&#xff0c;是由不同类型的列组成的二维数据表结构&#xff0c;类似于EXCEL表&#xff0c;语法格式如下&#xff1a; pandas.DataFrame(dataNone, indexNone, columnsNone, dtypeNone, copyNone)1.1 函数参数:data 参数…

计算机操作系统笔记总结:Part2 进程与线程

文章目录1 进程1.1 进程的概念、组成与特征1.2 进程的状态与转换1.3 进程的组织1.4 进程控制1.5 进程通信2 线程与多线程模型2.1 线程的概念2.2 线程的实现方式2.3 多线程模型2.4 线程的状态与转换3 处理机调度3.1 调度的三个层次3.2 进程的挂起态与七状态模型3.3 进程调度3.3.…

[附源码]Nodejs计算机毕业设计健身房预约平台Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

【浙工商期末报告】研一Python期末作业B题(思路分享+源代码分享+原报告分享)

目录&#xff1a;研一Python期末作业B题&#xff08;思路分享&#xff09;一、题目介绍1.1 A题1.2 B题二、B题思路讲解2.1 问题的引入2.2 不平衡数据集2.2.1 不平衡数据的实例2.2.2 不平衡数据集导致的问题2.2.3 不平衡数据集的主要处理方法2.2.4 不平衡&#xff08;均衡&#…

数据结构实验大作业(将之前预测ACM获奖的模型搬到Vue和django上)

目录 前言 成品展示&#xff08;UI写的确实有点糊弄&#xff0c;太懒了不想弄了&#xff09; Vue部分 App.vue&#xff08;中间感觉还行&#xff0c;不算难看&#xff09; result组件&#xff1a; 路由&#xff1a; Django部分 view functionset&#xff08;自己建的&am…