动规一些理解

动态规划我理解的写法就是自底向上,自顶向下

自底向上:先初始化小问题,再层层递进,所以一般自底向上会有一步初始化

自顶向下:递归求解,但是每次求解都会存储,又叫记忆化搜索

一、小偷偷东西

问题描述:

你是一个专业的小偷,准备偷一条街上的房子,假设有四个吧,你不能偷相邻两个房子,因为这样会触发警报,所以你可以偷1和4 1和3 2和4 现在你需要做的就是偷最大值,假设每个房子的价值是{2,7,9,3,1,5,8}

自底向上算法思路:

我们先考虑只有一个房子的情况,那肯定偷

再考虑有两个房子,我们是不是要考虑偷不偷第二个房子,如果偷了,第一个房子就偷不了了,所以要比较第二个房子和第一个房子谁的价值大

那再考虑有三个房子,由于两个房子的情况已经考虑过了,所以只考虑第三个房子偷不偷,如果偷了,第二个房子就偷不了,那么此时的价值就是第三个房子的价值加第一个房子的价值,如果不偷,那是不是就等价于只考虑前两个房子的情况,这个时候把偷和不偷做比较就可以求出考虑三个房子的最大值

那么再考虑有四个房子,由于前三个房子的最优解已经考虑过了,所以这个时候只考虑第四个房子偷不偷,如果偷了第三个房子就不让偷,所以这个时候的价值就是第四个房子的价值加上只考虑前两个房子的最优解,如果不偷,那就相当于只考虑了前三个房子

大致思路如下

image.png

于是我们申明一个vector用来存放结果并先初始化为0,其中dp[i] 代表考虑前i个房子的情况,为什么数组长度为n+1,其实原因很简单,如果长度为n,我们想输出考虑前4个房子的最优解,是不是要输出dp[3],而不是dp[4],这样不好输出结果啊,所以就多申明了一列

image.png

遍历房子的代码如下

image.png

完整代码如下

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {

	vector<int> value = { 2, 7, 9, 3, 1, 5, 8 };
	int n = value.size();
	vector<int> dp(n + 1, 0);

	dp[1] = 2;

	for (int i = 2; i <= n; i++)
	{
		dp[i] = max(dp[i - 2] + value[i - 1], dp[i - 1]);
	}


	cout << dp[n] << endl;

	while (true);
}

为了方便大家理解,大家自己写代码,也可以测试其中的任意一个值看看是否正确

image.png

二、01背包问题

问题描述:

当前你有一个背包重量为bagMax,有四个物品,每个物品都有自己的重量和价值,你需要考虑如何取物品才能让背包在不超容量的情况下价值最大

物品如下:

image.png

自底向上算法思路:

初始化两个数组用来存储weight 和 value

image.png

假设只考虑物品A,只需要考虑物品A放不放得进去,即 bagMax < weight 为真时候返回0,为假返回15 那么可以用一个数组存储结果 vectory<int> dp(bagMax,0),其中dp的长度是bagMax,并且每个值都初始化为0

f0b814af52e3231f82a715b5d6801c0d.png

image.png

可以看到这样的写法有一个问题,由于vector访问元素的时候计数器是从0开始,我要获取bagMax=7的value的时候就得访问dp[7-1],这个地方和生活之中略有差异,生活中应该是我要获取bagMax=7的value,直接输出dp[7]就好了对吗?解决这个问题应该不难,直接多初始化一行数据就好了

image.png

image.png

那么接下来,如果考虑物品A、B,怎么办?这个时候很容易想到用二维数组存放结果即 dp[i][j]

其中i代表考虑前i个物品,j代表bagMax=j的时候,所以dp[i][j]的意思就是说,考虑在前i个物品时,bagMax=j的时候的最优解

转换为代码就是,其中为什么wupinNums 要 +1 的理由和上面bagMax要 +1 的理由一样不再赘述了

image.png

接下来就是动态规划的思路了,先考虑第一个物品,即填充dp[1][j],思路也很简单,就是遍历bagMax,看看bagMax是不是比weight[0]大,如果大就填充其值为value[0],其实这个地方i可以从1开始,因为当i=0的时候bagMax也为0,就是说背包容量为0,那肯定是装不了东西的value一定为0,而我们初始化vector的时候已经赋值为0了,不过这里无所谓,不影响

image.png

接下来就是考虑两个物品的情况,即填充dp[2][j]的值,由于第一个物品我们已经考虑过了,即dp[1][j] (j属于[0,bagMax]) 是全部已知的,所以这个时候相当于只考虑第二个物品放不放,或者说第二个物品和第一个物品只放一个的话,放哪个,或者说两个都放?

我们先说不放的情况,如果不放第二个物品,那么dp[2][j]是不是就应该等于dp[1][j],因为你不放第二个物品就完全等价于没考虑第二个物品,只考虑第一个物品

那么再说放,如果在dp[2][j]的时候要放该物品,那么背包剩余容量是不是等于 j - weight[1](这里虽然是weight[1]但是其实是第二个物品的重量),那这个剩余的容量还够不够放物品1呢?是不是值得考虑的一个事情?这个时候就是动态规划衔接上了, 即j - weight[1]放不放物品1,是不是等价于在背包容量为  j - weight[1] 时只考虑物品1的最大价值,即dp[1][j-weight[1]]的值

所以如果你要放第二个物品,那么此时的价值应该是value[1](这里虽然是value[1]但是其实是第二个物品价值) + dp[1][j-weight[1]]对吗?但是此时放了第二个物品就一定比不放的结果dp[1][j]大吗?不一定,所以要做比较,流程图大概就是这样的

image.png

代码如下

image.png

这个时候再输出dp[i][j]就可以获取到,考虑i个物品,背包容量为j的时候的最大价值了

完整代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

/* 01背包问题二维数组 */

int main() {
	vector<int> weight = { 1, 3, 4, 5 };
	vector<int> value = { 15, 20, 30, 50 };
	int wupinNums = weight.size();
	int bagMax = 7;
	vector<vector<int>> dp(wupinNums + 1, vector<int>(bagMax+1, 0));

	// 初始化第一个物品
	for (int i = 0; i <= bagMax; i++)
	{
		if (i >= weight[0])
		{	
			dp[1][i] = value[0];
		}
	}

	// 遍历后面的物品
	for (int i = 2; i <= wupinNums; i++)
	{
		for (int j = 0; j <= bagMax; j++){
			if (j >= weight[i-1])
			{
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i-1]] + value[i-1]);
			}
			else
			{
				dp[i][j] = dp[i - 1][j];
			}
		}
	}

	cout << dp[wupinNums][bagMax] << endl;

	while (true);
}

为了方便大家理解和测试我把当bagMax=7的时候的所有值都列举出来了

image.png

智慧政务:打造“线上”有温度、“线下”有速度的新体验 在数字化浪潮的推下,智慧政务正成为政府服务转型的重要方向。通过数据共享与流程优化,智慧政务解决方案致力于解决企业和群众反映强烈的办事难、办事慢、办事繁等问题,实现“一网通办”,让政务服务更加便捷、高效。 一、智慧政务的发展趋势 近年来,随着数字中国战略的深入实施,政务服务正朝着“全国一体化”方向发展。从最初的“可看可查”到如今的“一网通办”,政务服务经历了从互联网+政务服务(省市县)到长三角一体化政务平台,再到区域/全国一体化在线政务服务平台的飞跃。国务院及各级政府积极推进大数据、政务服务改革,明确建设目标、内容和节奏,为智慧政务的发展提供了强有力的政策支持。 二、智慧政务的核心挑战 尽管智慧政务取得了显著进展,但仍面临诸多挑战。跨部门、多流程环节的政务服务中,数据共享时效性差、权责不清成为制约协同效率的主要因素。同时,数据安全管控不足、数据质量问题缺乏责任追溯,也影响了政务服务的可信度和质量。此外,在线办理深度不够、群众认同感不高,以及政务热线服务多样性、便捷性和智能性不足,都是当前智慧政务需要解决的问题。 三、智慧政务解决方案的创新实践 针对上述挑战,智慧政务解决方案通过一系列创新实践,推政务服务向线上线下一体化方向发展。具体而言,该方案包括以下几个关键方面: “一码通”服务:面向民众和企业,提供行、办、用、管一体化的政务服务。通过“一码通”,群众和企业可以在政务服务大厅及试点事项中,使用电子证照调用授权,实现身份证明、社会保障信息核验、医疗健康一码通办等功能。这不仅简化了办事流程,还提升了用户体验。 “一网通”服务:提供全程网办的政务服务。通过智能预审、远程面审、一窗办理、智能引导等功能,实现政务服务的全流程网上办理。群众和企业可以足不出户,通过政务服务官网、APP、小程序等多种渠道,享受7*24小时全天候的政务服务。 “一号通”服务:作为政务服务智能总客服,通过全媒体接入方式,整合热线、微信、邮件、短信等多种服务渠道,实现一号对外、服务通达。运用人工智能技术,构建自服务应答体系,提高服务效率和质量。同时,通过大数据分析,及时掌握舆情热点和政情民意,为服务监督和实时决策提供依据。 “协同办”与“协同管”:面向政府工作人员,提供办、查、看、管一体化的工作门户。通过集成门户、工作中心、信息中心、知识中心等功能模块,实现政务工作的统一管理和高效协同。同时,整合监管数据、打通监管业务、感知监管风险,助力监管决策,提升政府治理能力。 四、智慧政务的未来展望 随着新基建的加速推进,5G、AI、工业互联网、物联网等新型基础设施的建设将为智慧政务的发展提供更强有力的支撑。未来,智慧政务将继续深化数据共享与流程优化,推政务服务向更加智能化、便捷化、个性化的方向发展。同时,通过加强跨部门、跨领域的监管协同,提升政府治理能力和服务水平,为构建数字政府、掌上政府奠定坚实基础。 总之,智慧政务解决方案通过创新实践,正在逐步解决政务服务中的痛点问题,让“线上”服务更有温度、“线下”服务更有速度。随着技术的不断进步和应用的深入推广,智慧政务将迎来更加广阔的发展前景。
内容概要:本文介绍了一种基于中位数的多个候选观测信号的状态估计方法,重点研究了异常值的处理机制,旨在提升状态估计的鲁棒性与准确性。该方法通过选取多个观测信号并利用中位数的抗干扰特性,有效抑制异常值对估计结果的影响,适用于存在噪声或异常测量的复杂系统。文中提供了完整的Matlab代码实现,便于读者验证和应用该算法,并通过实验分析验证了其在异常值存在情况下的优越性能。; 适合人群:具备一定信号处理、状态估计或自化背景【状态估计】使用中位数的多个候选观测信号的状态估计方法,包括异常值研究(Matlab代码实现)的科研人员及工程技术人员,尤其适合从事控制系统、传感器融合、电力系统状态估计等相关领域的研究生和工程师。; 使用场景及目标:①应用于存在异常观测值的实际系统中,如传感器故障、通信干扰等场景下的状态估计;②用于提升传统估计算法的鲁棒性,对比中位数方法与均值、加权最小二乘等方法的抗噪能力;③作为科研参考,复现算法并进一步改进,用于论文研究或工程项目开发。; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解中位数在多信号融合中的具体实现方式,重点关注异常值注入前后的估计效果对比,深入掌握算法鲁棒性设计思路,并可将其扩展至其他状态估计框架中进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值