poj 2836 + 一些关于dp的新看法

在Unity中为Sentis部署的YOLOv8模型集成NMS层并实现移动端性能优化 本文详细讲解了在Unity中利用Sentis部署YOLOv8模型时,如何通过代码动态集成NMS层以解决移动端性能瓶颈。文章核心在于避免导出时绑定NMS,转而使用Sentis原生API在运行时高效构建NMS处理流程,并分享了关键的GPU数据操作与移动端性能优化技巧,确保模型在移动设备上流畅运行。 阅读详情

对于一般的dp(除了数位dp),在思考状态转移方程的时候,一般有两种思路。

  1. 用过去的最优解推当前的最优解
  2. 用当前的最优解去推未来的最优解

具体用01背包来演示一下
第一种

for (int i = 0; i < n; i++) 
		for (int j = v; j >= 0; j--) 
			dp[j] = max(dp[j], dp[j - c[i]] + w[i]);

dp[v]是当前状态,dp[v-c[i]]是过去状态,这种思路就是过去推现在。

第二种

for (int i = 0; i <=v; i++) 
		for (int j = 0; j < n; j++) 
			dp[j + c[i]] = max(dp[j + c[i]], dp[j] + w[i]);
//略微简略,明白意思就好

dp[v]是当前状态,dp[v + c[i]]是未来状态。这种思路就是现在推未来。

对于01背包问题,显然这两种思路都是正确的。不过有的题就不是这么幸运了。

题意:
给你n个点,让你用任意个边长为整数的矩形包裹起来(边要与坐标轴平行),问所有矩形面积之和的最小值是多少?

输入
2 //表示两个点
0 1 //点
1 0 //点
0 //表示输入结束

输出
1 //表示答案

思路:
先把点两两组合,任意两个点构成一个矩形(一共构成n*(n-1)/2个矩形),这个矩形中间可能包含其他点,然后记录这个矩形的面积和包含那些点(用二进制表示)。然后就可以跑dp了

dp[i]定义:i的二进制位表示包含这些点的时候的最小面积。这样任意的dp[i]都是由多个矩形组合构成的,再进一步,任意的dp[i]都是由某个矩形和dp[j]构成,这样就有了状态转移。

状态转移:
这时候我们之前讲个两种思路就派上用场了,如果使用第一种思路,假设要求dp[i],那么我们就要在已知a和i的情况下,找出所有a|b=i的解,因为上面说了,dp[i]是由一个矩形和dp[j]组成,那么代码就就应该这样写

for (int i = 0; i < (1 << n); i++) {
			for (int j = 0; j < rect.size(); j++) {
				//因为我要求dp[i],
				//意思是a|b=i,我已知a和i,
				//所以我不得不再来一个循环取找b
				for (int k = 0; k < (1 << n); k++) {
					//cover的二进制位表示这个矩形包含那些点
					//area表示这个矩形的面积
					if (k | rect[j].cover == i) {
						dp[i] = min(dp[i], dp[k] + rect[j].area);
					}
				}
			}
		}

这样做的复杂度是O(n^2 * 2^n * 2^n)因为n=14,所以算出来循环5*10的10次方。超时。

如果用第二种思路,假设已知dp[b],那么dp[b]能得到哪些未来状态呢?很显然dp[b]和任意矩形组合就可以得到一个未来的状态 ,相当于在已知a和b的情况下求a|b=i的解,这就很容易了
写成代码应该是这样

for (int i = 0; i < rect.size(); i++)
			for (int j = 0; j < (1 << n); j++) {
				int future = j | rect[i].cover;
				dp[future] = min(dp[future],dp[j] + rect[i].area);
			}

这时候复杂度是O(n^2 * 2^n * 1),为什么复杂度要1,因为这个脑残编辑器不1他就显示不出来。循环次数10的7次方。能ac;

下面是完整代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <vector>
#include <map>

#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int

using namespace std;

struct Rect {
	int area, cover;
	Rect(int a,int c):area(a),cover(c){}
	void add(int x) { cover |= x; }
};

int n, x[20], y[20],dp[1<<20];

int main(){
	while (scanf("%d", &n) != EOF && n) {
		for (int i = 0; i < n; i++)
			scanf("%d%d", x + i, y + i);

		vector<Rect> rect;
		for (int i = 0; i < n; i++) 
			for (int j = i + 1; j < n; j++) {
				Rect temp(max(1, abs(x[i] - x[j]))*max(1, abs(y[i] - y[j])),
					(1 << i) | (1 << j));
				for (int k = 0; k < n; k++)
					if (((x[i] - x[k]) * (x[j] - x[k]) <= 0) && ((y[i] - y[k]) * (y[j] - y[k]) <= 0))
						temp.add(1 << k);
				rect.push_back(temp);
			}

		memset(dp, INF, sizeof(dp));
		dp[0] = 0;
		for (int i = 0; i < rect.size(); i++)
			for (int j = 0; j < (1 << n); j++) {
				int future = j | rect[i].cover;
				dp[future] = min(dp[future],dp[j] + rect[i].area);
			}
				
			
		printf("%d\n", dp[(1 << n) - 1]);
	}

	return 0;
}
OpenClaw人人养虾:发现与传输 客户端需要先"发现"Gateway 的地址和端口,才能建立连接。OpenClaw 支持多种发现(Discovery)和传输(Transport)机制。 阅读详情

相关推荐

CAPL 中的变量类型详解与应用

CAPL 中的变量类型详解与应用

qq_42268594的博客 1448

poj 2836

题目链接:http://poj.org/problem?id=2836 题目类型:

u010621873的专栏 658

从信号到振镜:STM32F103 + XY2-100协议 + AM26LS31芯片的激光打标/雕刻系统信号链搭建指南

本文详细介绍了基于STM32F103微控制器和XY2-100协议的激光打标/雕刻系统信号链搭建方法。从数字振镜控制协议解析、AM26LS31差分驱动电路设计到信号完整性优化,提供了一套完整的解决方案,帮助工程师实现高精度激光控制系统的开发与调试。

weixin_42536058的博客 236

【状态压缩】poj 2836 Rectangular Covering

题意:给出n个平面上的点,用多个矩形去覆盖所有的点,要求每个矩形的边与坐标轴平行,每个都至少覆盖两个点(包含在边上的),如何选择矩形使得面积最小? 思路:毫无思路。。。看了题解之后才发现好暴力啊,枚举两个点,得到一个矩形(注意特判横坐标相等或纵坐标相等)。 dp[S]代表选了S集合代表的点所需要的最小面积,枚举目前哪些点已经被覆盖,枚举矩形,如果这个矩形能覆盖更多的点,更新新状态需要的最小面积...

iroy33的博客 216

三边定位的最小二乘法运用

已知:条件基站到移动台的距离D,基站的坐标(xi,yi,zi) 求:移动台的坐标(x,y,z) 运用最小二乘法的核心是找到最小二乘法的矩阵形式即 Ax=B 在本次实验中通过三边定位计算得到 A=[A;2*(xi-x1),2*(yi-y1),2*(zi-z1]; %系数矩阵A b=[b;D1^2-Di^2+xi^2+yi^2+zi^2-x1^2-y1^2-z1^2]; %增广矩阵b

qq_26250141的博客 1万+

PX4飞控与MAVROS实战:从零搭建无人机ROS通信环境(附常见报错解决)

本文详细介绍了如何从零搭建PX4飞控与ROS的通信环境,重点解析了MAVROS的安装、硬件连接、串口权限配置以及坐标系转换等核心步骤。针对GeographicLib数据下载失败、串口权限不足等常见报错提供了实用解决方案,并附有Offboard模式控制的代码示例,帮助开发者快速建立稳定的无人机ROS开发环境。

dapp9builder的博客 335

POJ2836

状压DP死活想不到啊,开始还以为是数据结构题,真是膜拜宋威大大。 包括点的矩形最小一定以这些点为顶点,所以枚举所有点对,构成所有状态。 由于不存在面积为0的矩形,所以当横纵坐标相同时得特判。 然后就是状压dp了。 #include #include #include #include #include #include #include #include using namespace s

无名山丘,崛起成峰 1316

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

POJ 2836 Rectangular Covering(状压DP)

【题目链接】http://poj.org/problem?id=2836 【题目大意】   给出二维平面的一些点,现在用一些非零矩阵把它们都包起来,   要求这些矩阵的面积和最小,求这个面积和 【题解】   我们计算出以每两个点为矩形顶点所构成的矩形面积和包含的点子集,   然后对这些子集进行状态DP,求全集的最小覆盖 【代码】 #includ...

weixin_30337157的博客 109

山东大学机器学习(实验一内容)——线性回归

1. 描述 第一个练习将为你提供线性回归练习。这些练习已经用Matlab进行了广泛的测试,但它们也应该在Octave中工作,它被称为“免费版的Matlab”。如果你使用的是Octave,那就是 一定要安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。 2.线性回归 回想一下,线性回归模型是 hθ(x)=θTx=∑j=0nθjxj h_{\th...

HachiLin的博客 4108

PLC集群管理:C#上位机实现10台以上分布式PLC的集中监控与指令下发

本文介绍了一套基于C# WPF开发的PLC集群管理系统,用于解决现代工业自动化产线中分布式PLC监控难题。系统采用三层解耦架构,支持100台以内不同品牌PLC的集中管理,具备批量数据采集、指令下发、实时报警等功能。核心创新点包括:1)基于异步IO的连接池管理;2)统一通信接口设计;3)寄存器合并优化算法;4)三级优先级指令队列。实际应用表明,系统数据采集延迟低于100ms,指令下发成功率99.9%,有效解决了传统单PLC监控模式存在的效率低下问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 507

poj 2836 (状压DP

题意: 给你一些点,你可以用矩形覆盖它们,每个矩形最少覆盖2个点,求这些矩形的最小面积 思路: 一开始以为是扫描线之类的做法,根本想不到怎么状压DP,我的失误在于两点:第一点是没有认真读题,这道题的面积是可重的,第二点在于没有关注到每个矩形最少覆盖两个点,其实这就提醒了我们状态怎么覆盖,我们只要枚举任意2个点组成的矩形,又由于是最小,就可以让这两个点作为对角线上的点,这样就可以覆盖所有的维度了,所以我们让dp[i]表示状态为i的时候的最小面积,预处理出所有矩形及其对应的状态就可以了,还需注意,长宽最小为1,

weixin_45539557的博客 210

5. SAP UI5 视图控制器(Controller)初探

本教程的前一个步骤也就是第四个步骤,我们了解了 SAP UI5 XML 视图的使用方法。在该步骤里,我们在 XML 视图里声明了一个 Text 控件实例,该控件位于 sap.m 这个命名空间内。 本步骤会继续接触 SAP UI5 MVC 框架中三大基石的另一块:C - Controller,即控制器。 先看看本步骤完成之后,我们得到的 SAP UI5 应用能实现一个什么样的效果。 访问如下 url: http://localhost:8080/webapp/index.html 能看到一个 Say Hell

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4595

poj2836 状态压缩~矩形覆盖

首先预处理每两个点为顶点包含的点集合,然后往后直接DP。 ACcode: #include #include const int NS=15; const int INF=1<<30; int n,lx,rx,uy,dy,lim; int g[NS][NS],ar[NS][NS]; int x[NS],y[NS],dp[1<<NS]; int Max(int xa,int xb)

丿Smilē 丶晨星灬 1487

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

POJ 2836状压dp

我们可以通过再草稿纸上模拟矩形的枚举方式发现,最优解矩形一定是两个点为对角线的矩形(特殊情况除外),那我们就通过枚举 每两个点来进行状态压缩,把这个两个点所包围的面积中的点压缩再里面,然后通过|表达式,如果最后点集|出来达到了(1<<n),那么就比较最小值。 主要是注意一下这里不能为零矩形的面积。 #include<iostream> #include<cstring...

weixin_44019404的博客 208

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj2836(状压dp)

/* translation: 二维平面上有n个点,现在求用长宽任意的矩形完全覆盖这些点所用的最小矩形面积总共是多少? solution: 状压dp dp[s]:=当前状态下最小面积 dp[当前状态] = min(dp[过去状态] + 矩形面积, dp[当前状态]) note: # 这里注意,先对所有矩形进行预处理的时候,当要枚举的矩形的两个顶点在同一行或者同一列的点时,由于不允许面积为

林伏案的博客 456

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

POJ 2836 状压 DP

大致题意

neweryyy的博客 236

POJ部分状压dp的题目(更新进度3/5)

状压dp刷题记录 挑战后面四道状压dp。 Poj2441–Arange the Bulls Poj2441 题目链接在上面了。根据题目的数据范围,很显然就可以状态压缩,最多只有20的Barns,但是需要注意不能直接开 N * (1<<M)大小的dp数组,会爆。需要对空间优化,用滚动数组,从后往前递推。因为使用了滚动数组,所以不能记忆化搜索。 #include <iostrea...

一个菜的不行的人的博客 251

POJ - 2836 Rectangular Covering 预处理 + 状压DP

传送门:POJ2836 题意:坐标平面上有n各点,用任意大小(非零)的矩形覆盖它们,每个矩形至少覆盖两个点,矩形边长为正整数,求最少所需要的矩形的总面积。 思路:先将平面上任意两个点组成的矩形预处理出来,并将每个矩形内部包含的点的状态压成一个整数,然后进行dp,dp[s]表示覆盖的点集状态为s的最小面积,枚举每个预处理出来的矩形进行转移就好了。 代码: #include #include

WA是一笔财富 407

[POJ 2836] Rectangular Covering (状压DP)

POJ - 2836 选择若干个矩阵,每个矩阵至少覆盖两个点 问覆盖 N个点所需的矩阵面积和最小是多少 状态压缩DP 首先预处理出矩阵能覆盖哪些点,以及矩阵的面积 然后枚举当前要选择的两点,转移方程为 dp[mask] = min(dp[mask], DP(mask|stat[i][j])+sqre[i][j])注意几个坑点: 如果两点在平行坐标轴的一条直线上,它依旧是有面积的 可以

MisDeer's blog 337

poj 2836 Rectangular Coverin

题目:http://poj.org/problem?id=2836 在一个二位平面内,有y

qqspeed 1175

poj2836 状态压缩dp

自己的做法是枚举i,j作为顶点的矩形,然后再更新状态S,但是这种做法是错误的 正解是先把所有矩形对求出来,然后枚举状态S,每个处理每个状态时再枚举已经求出的矩形对,用旧状态更新新状态 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i...

weixin_30433075的博客 67

POJ2836 Rectangular Covering(状压DP)

题目是平面上n个点,要用若干个矩形盖住它们,每个矩形上至少要包含2个点,问要用的矩形的面积和最少是多少。 容易反证得出每个矩形上四个角必定至少覆盖了两个点。然后就状压DP: dp[S]表示覆盖的点集为S要用的最少矩形面积 转移我一开始是未覆盖的点和已覆盖的点构成一个矩形来转移,这是错的,因为这样子的结果是所有矩形都相连的最小面积和。 正确的是枚举还未被覆盖的矩形来转移。转...

dengliugong3918的博客 180

Poj 2836 Rectangular Covering(状压DP)

题意:        给你n个顶点,用任意个边垂直于x轴和y轴的矩形进行覆盖,最小覆盖面积是多少,都为整数. 思路:        先预处理处两两点的面积,和这个面积包围的点。        之后进行这样的定义 dp[S] := 当前点集为S时的最小面积        若将要选取的两个点点集为coverd, 面积为area        dp[S | ( 1 制约:

fisty 962

poj 2836 子集 状态压缩dp

题意: 坐标平面上有n各点,用任意大小(非零)的矩形覆盖它们,求最省的矩形的总面积。 解析: 预处理,将n个点两个两个组合构成多个矩形,然后将在矩形内部的点更新进矩形中。 然后就是dp的过程了: dp[0] = 0。初始时集合中没有点,并且面积为0。 dp[nowS] = min ( dp[nowS], dp[s] + area)。 当前的点集的矩阵取,还是不取。

渐近自由 571

poj 2836 Rectangular Covering

http://poj.org/problem?id=2836题意:给你n个点的坐标,求覆盖所有顶点的最小矩形面积(每个矩形至少覆盖两个顶点)#include #include #include #include #include #include #include #include #include #include using namespace std;#define MM(a) memset

smilesundream的博客 546
上一篇: cf 1326e
下一篇: poj1740 博弈(赖皮)之道,在我内心延续
FawkesLi
博客等级 码龄8年 21粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值