83--86 动态规划​

动态规划
动态规划算法通常用于求解具有某种最优性质的问题。
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

83  爬楼梯的最少成本

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。

请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

https://leetcode-cn.com/problems/GzCJIP/icon-default.png?t=LA92https://leetcode-cn.com/problems/GzCJIP/

//构造公式最重要	dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
func minCostClimbingStairs(cost []int) int {
	n := len(cost)
	dp := make([]int, n+1)
	for i := 2; i <= n; i++ {
		dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])
	}
	return dp[n]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

 84  房屋偷盗

一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
//定义 dp[i]为偷盗至i房间的最大收获值,初始可以选择从第一个房子偷还是第二个
//dp[0] = nums[0]
//dp[1] = nums[1]
//dp[2] = max(dp[1],dp[0]+nums[2])
//dp[i] = max(dp[i-1],dp[i-2]+nums[i])
func rob(nums []int) int {
	if len(nums) < 2 {
		//题目告诉我们nums长度一定大于等于1
		return nums[0]
	}
	dp := make([]int, len(nums))
	dp[0] = nums[0]
	dp[1] = max(nums[0],nums[1])
	for i := 2; i < len(nums); i++ {
		dp[i] = max(dp[i-1], dp[i-2]+nums[i])
	}
	return dp[len(dp)-1]
}

85 环形房屋偷盗

一个专业的小偷,计划偷窃一个环形街道上沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

func robNoCicle(nums []int) int {
	if len(nums) < 2 {
		//题目告诉我们nums长度一定大于等于1
		return nums[0]
	}
	dp := make([]int, len(nums))
	dp[0] = nums[0]
	dp[1] = max(nums[0],nums[1])
	for i := 2; i < len(nums); i++ {
		dp[i] = max(dp[i-1], dp[i-2]+nums[i])
	}
	return dp[len(dp)-1]
}

//房子改成了环形的,选了0就不能选length-1
//两种情况,选0  0 -- nums[i-1]
//选 1 0-- nums[i]
func rob(nums []int) int {
    if len(nums) < 2 {
		//题目告诉我们nums长度一定大于等于1
		return nums[0]
	}
	num1:=robNoCicle(nums[1:])
	num2:=robNoCicle(nums[:len(nums)-1])
	return max(num1,num2)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

 86 粉刷房子

假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。

当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。

例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。

请计算出粉刷完所有房子最少的花费成本。

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

//红 蓝 绿
//00 0号红     01 0号蓝  02 0号绿
//dp[i][j] 表示到i房子选j花费最小值
//dp[i][0] = min(dp[i-1][1]+costs[i][0],dp[i-1][2]+costs[i][0])
//dp[i][1] = min(dp[i-1][0]+costs[i][1],dp[i-1][2]+costs[i][1])
//dp[i][2] = min(dp[i-1][0]+costs[i][2],dp[i-1][1]+costs[i][2])
func minCost(costs [][]int) int {
	//转换cost
	dp:=make([][]int,len(costs))
	for i:=0;i<len(dp);i++{
		dp[i] = make([]int,3)
	}
	dp[0] = costs[0]
	for i:=1;i<len(costs);i++{
		dp[i][0] = min(dp[i-1][1]+costs[i][0],dp[i-1][2]+costs[i][0])
		dp[i][1] = min(dp[i-1][0]+costs[i][1],dp[i-1][2]+costs[i][1])
		dp[i][2] = min(dp[i-1][0]+costs[i][2],dp[i-1][1]+costs[i][2])
	}
	//取最小
	var res int
	res = min(dp[len(costs)-1][0],dp[len(costs)-1][1])
	res = min(res,dp[len(costs)-1][2])
	return res
}

CVE-2020-4448 是一个与 IBM Security Access Manager (ISAM) 相关的漏洞,该漏洞属于身份验证绕过类型。攻击者可以利用此漏洞在未经过身份验证的情况下访问受保护的资源,从而可能获取敏感信息或执行未经授权的操作。 ### 漏洞细节 - **漏洞编号**:CVE-2020-4448 - **产品名称**:IBM Security Access Manager for Mobile, IBM Security Access Manager Virtual Appliance 等。 - **影响版本**:7.0.0.x、9.0.0.x 和 9.0.1.x 版本中受影响 [^1]。 - **漏洞类型**:身份验证绕过(Authentication Bypass)。 - **CVSS 评分**:CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N,评分为 9.8 分,表示为高危漏洞 [^1]。 - **漏洞描述**:由于对某些请求的身份验证检查不充分,远程攻击者可以通过发送精心构造的请求来绕过身份验证机制。这可能导致未经授权的用户访问受限资源或管理接口 [^1]。 ### 影响 如果成功利用该漏洞,攻击者可以在没有有效凭证的情况下访问 ISAM 的某些功能模块,包括但不限于: - 访问受保护的 Web 资源。 - 获取用户的会话令牌或其他敏感数据。 - 对系统配置进行更改,进而导致整个系统的安全性下降 [^1]。 ### 缓解措施 为了防止 CVE-2020-4448 漏洞被利用,建议采取以下措施: - **升级补丁**:IBM 已经发布修复程序,建议将受影响的产品升级到安全版本。具体补丁信息可参考 IBM 官方支持页面。 - **最小权限原则**:确保用户仅拥有完成其工作所需的最低权限,以减少潜在的攻击面。 - **网络隔离**:将 ISAM 设备放置在适当的网络隔离环境中,避免直接暴露给外部网络。 - **监控与审计**:启用详细的日志记录和实时监控,以便及时发现异常活动并作出响应 [^1]。 ### 验证工具 目前没有公开的自动化工具专门用于检测 CVE-2020-4448,但可以通过以下方法手动验证是否存在风险: - 检查系统是否运行在受影响的版本上。 - 查看是否有最新的安全更新应用。 - 使用网络扫描工具(如 Nmap 或 Burp Suite)测试身份验证机制是否正常工作 [^1]。 ### 示例代 以下是一个简单的 Python 脚本示例,用于检测目标服务器是否响应了与 CVE-2020-4448 相关的特定 HTTP 请求: ```python import requests url = "https://target.com/isam" headers = { "User-Agent": "Mozilla/5.0", "Authorization": "Bearer dummy_token" # 尝试使用无效 Token 发起请求 } response = requests.get(url, headers=headers, verify=False) if response.status_code == 200: print("Potential vulnerability detected!") else: print("No evidence of vulnerability found.") ``` 请注意,此脚本仅为演示目的,实际测试应谨慎操作,并确保遵守相关法律法规及授权范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值