当前位置:网站首页>力扣:474.一和零
力扣:474.一和零
2022-08-09 22:11:00 【empty__barrel】
力扣:474.一和零
题目:
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
dp数组含义:
dp[i][j] :0~n个物品放入容量为i个0,j个1的背包中的最大价值
递归公式:
dp[i][j] = max(dp[i][j],dp[j-当前值几个0][j-当前值几个1]+1)
初始化:
dp【i】【j】要么选择原先的dp【i】【j】(即初始化的dp【i】【j】)要么选择新计算的值,会选择两者中较大的那一个。
- 如果dp【i】【j】是选择原先的dp【i】【j】即初始化的dp【i】【j】,又因为此时是从物品数为0开始遍历,按照含义来说其值应该是0。
- 如果dp【i】【j】选择的是新计算的值,dp【i】【j】是从二者中选择更大的值,那么这个初始化的dp【i】【j】就不能够大于新计算的值,新计算的值恒大于0。所以初始化的dp【i】【j】为0即可。
遍历顺序:
遍历背包重量所有可能性
遍历1个物品放入所有可能性重量的背包
遍历2个物品放入所有可能性重量的背包
遍历n个物品放入所有可能性重量的背包,此时才能够确保dp【i】【j】选择的是dp[j-zeronum][j-onenum]+1的时候,此值是已知的。
此时只需要确保dp【i】【j】选择的是dp[j-zeronum][j-onenum]+1的时候,此值是已知的即可,那么先遍历i,j都可以。
for(string str: strs){
int onenum = 0,zeronum = 0;
for(char c: str){
if(c=='0') zeronum++;
else onenum++;
}
for(int i = m; i >= zeronum; --i){
for(int j = n; j >= onenum; --j)
{
dp[i][j] = max(dp[i][j],dp[j-zeronum][j-onenum]+1);
}
}
}
边栏推荐
猜你喜欢
【Burning】It's time to show your true strength!Understand the technical highlights of the 2022 Huawei Developer Competition in one article
都在说云原生,那云原生到底是什么?
k8s部署mysql
数字与中文大写数字互转(5千万亿亿亿亿以上的数字也支持转换)
kubesphere
集群的基础形式
测试2年,当时身边一起入行的朋友已经月薪20k了,自己还没过万,到底差在了哪里?
Qt message mechanism and events
Mysql集群 ShardingSphere
直播预告 | ICML 2022 11位一作学者在线分享神经网络,图学习等前沿研究
随机推荐
tiup cluster scale-out
2020年度SaaS TOP100企业名单
为什么刀具数据库无法打开?
YGG 经理人杯总决赛已圆满结束,来看看这份文字版总结!
JS--hashchange事件--使用/教程
联盟链技术应用的难点
金仓数据库 KingbaseGIS 使用手册(6.5. 几何对象编辑函数)
The 2022-8-9 sixth group of input and output streams
Tencent continues to wield the "big knife" to reduce costs and increase efficiency, and free catering benefits for outsourced employees have been cut
leetcode:319. 灯泡开关
【微信小程序开发(八)】音频背景音乐播放问题汇总
CGLIB源码易懂解析
Miscellaneous talk - the sorrow of programmers
Linux 配置MySQL
leetcode:321. 拼接最大数
Analyses the development status quo of stock trading
数字与中文大写数字互转(5千万亿亿亿亿以上的数字也支持转换)
kubesphere
制定量化交易策略的基本步骤有哪些?
SRv6性能测量