Ones and Zeroes

本文介绍了一种解决双背包问题的变形题目的方法,通过增加一维度使用动态规划来寻找字符串数组中最多数量的子集,该子集中的0和1分别不超过给定的两个限制。



题目分析

1. 这题是有两个背包的背包问题变形

2. 直接在原来的背包问题上增加一维,就可以套用原有的状态转移方程解答。


题目代码

class Solution {
public:
	int findMaxForm(vector<string>& strs, int m, int n) {
		vector<vector<int>> f(m + 1, vector<int>(n + 1, 0));
		for (int i = 0; i < strs.size(); i++) {
			int z = 0;
			int o = 0;
			for (auto x = strs[i].cbegin(); x != strs[i].cend(); x++)
				if (*x == '0') z++;
				else o++;
				for (int j = m; j >= z; j--)
					for (int k = n; k >= o; k--)
						f[j][k] = f[j][k] >= f[j - z][k - o] + 1 ? f[j][k] : f[j - z][k - o] + 1;
		}
		return f[m][n];
	}
};


### MATLAB 中通过预分配数组优化循环性能 在 MATLAB 中,预分配数组是一种常见的技术,用于提高程序的执行效率并减少内存开销。当未预先定义数组大小时,在每次迭代中动态扩展数组会显著增加计算时间,因为 MATLAB 需要不断重新调整数组的空间[^1]。 #### 使用 `zeros` 和 `ones` 进行数组预分配 可以使用内置函数 `zeros` 或 `ones` 来创建指定大小的零矩阵或全一矩阵作为初始值。例如: ```matlab % 创建一个 n 行 m 列的零矩阵 A = zeros(n, m); % 创建一个 n 行 m 列的全一矩阵 B = ones(n, m); ``` 这些初始化操作可以在进入循环之前完成,从而避免在循环内部逐次扩展数组带来的额外负担[^2]。 #### 示例代码展示预分配的优势 下面是一个简单的例子说明如何利用预分配提升性能: 假设我们需要存储一系列数值到向量 v 中,则可以通过如下方式实现更高效的运算过程: ```matlab n = 1e6; v_prealloc = zeros(1,n); % 提前声明好足够的空间给变量v_usePreAlloc tic for i=1:n v_prealloc(i) = sin(i*0.001); end time_with_preallocation=toc; clear all;clc; w_no_prealloc=[]; tic for j=1:n w_no_prealloc(end+1)=sin(j*0.001); end time_without_preallocation=toc; fprintf('Time with Pre-allocation: %.4f seconds\n', time_with_preallocation); fprintf('Time without Pre-allocation: %.4f seconds\n', time_without_preallocation); ``` 可以看到不进行任何准备工作的版本耗时明显更多[^3]。 #### 对于复杂数据结构的选择 - Cell Arrays 如果目标是保存不同类型的元素或者长度不定的数据集合,那么应该考虑采用单元格阵列(cell arrays),它允许每个位置容纳任意形式的内容(标量、字符串甚至其他子细胞)。同样也可以先设定其大致规模再填充具体内容以获得更好的表现效果。 ```matlab C = cell(1, N); % 初始化具有N个槽位的cell array C for k = 1:N C{k} = rand(M(k), P(k)); % 将随机生成的小型二维矩阵放入第k个slot里 end ``` 以上就是关于MATLAB中的preallocate概念及其应用的一些介绍和实例分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值