474. Ones and Zeroes

474. Ones and Zeroes

  • Total Accepted: 9812
  • Total Submissions: 25753
  • Difficulty: Medium
  • Contributors:piy9

In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue.

For now, suppose you are a dominator of m 0s and n 1s respectively. On the other hand, there is an array with strings consisting of only 0sand 1s.

Now your task is to find the maximum number of strings that you can form with given m 0s and n 1s. Each 0 and 1 can be used at mostonce.

Note:

  1. The given numbers of 0s and 1s will both not exceed 100
  2. The size of given string array won't exceed 600.

Example 1:

Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
Output: 4

Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are “10,”0001”,”1”,”0”

Example 2:

Input: Array = {"10", "0", "1"}, m = 1, n = 1
Output: 2

Explanation: You could form "10", but then you'd have nothing left. Better form "0" and "1".
题目:给一个string的数组,并且给两个整数m和n,取一个string的组合,使得组合中0的个数为m,1的个数为n。找出一个组合,使其中的字符串个数最多。

提醒:这题的结果一定存在,就是说一定有符合 0s = m, 1s = n的组合,不需要考虑存在性。

这一题求的是最优结果,我们可以尝试使用动态规划。

我们另 f(a, b)为0的个数为a,1的个数为b的最优组合(字符串个数最多)

那么有递推式:

f(a, b) = max(f(a, b), f(a-i, b-j) + 1)

其中, i是其中一个字符串s中0的个数,j是s中1的个数。

这个递推式的意思就是,是在求f(a, b)时否选择字符串s加入组合中

代码如下:

int findMaxForm(vector<string>& strs, int m, int n) {
      int f[m+3][n+3];
      for (int i = 0; i <= m; i++)
          for (int j = 0; j <= n; j++)
              f[i][j] = 0;                         
//全部初始化为0
    
    for (string &s: strs){              
 //遍历vector
    int one = 0, zero = 0;
   
for (char c: s)
   
if (c == '0') zero++;
   
else one++;                        //计算字符串s中0的个数和1的个数
    for (int i = m; i >= zero; i--)       //更新f二维数组,使其达到此时最优
       for (int j = n; j >= one; j--)    //如果i<zero或者j<one,则i-zero 和j-one为负数,不存在
        f[i][j] = max(f[i][j], f[i-zero][j-one]+1);   
}
return f[m][n];

}



这段代码是使用OpenCV实现花着色的示例代码。下面是对代码的解释: 1. 使用cv2.imread函数读取输入图像work8.tif,并使用参数-1表示读取的是原始图像,包括alpha通道。 2. 将原始图像转换为彩色图像,因为后面需要用到颜色信息。 3. 将彩色图像转换为HSV颜色空间,方便对颜色进行筛选。 4. 设置颜色范围,这里设置了灰色的颜色范围,lower_gray表示下限颜色,upper_gray表示上限颜色。 5. 使用cv2.inRange函数根据颜色范围创建掩膜,将符合范围的像素设置为白色,不符合的设置为黑色。 6. 使用cv2.morphologyEx函数对掩膜进行去噪操作,这里采用了开运算操作,可以去除一些小的噪点。 7. 使用cv2.bitwise_and函数获取花的部分,将原始图像和掩膜做按位与操作,得到的结果就是花的部分。 8. 定义一个颜色数组color,将需要着色的部分变为蓝色,这里将蓝色通道设置为255,绿色通道设置为255,红色通道设置为0。 9. 复制原始图像img,将需要着色的部分按照掩膜进行着色,将值为1的部分设置为蓝色,其余部分保持不变。 10. 显示结果,使用cv2.imshow函数展示着色后的花图像和原始图像。使用cv2.waitKey函数等待用户按下任意键,关闭窗口。 需要注意的是,这段代码仅适用于特定的输入图像,对于其他图像可能需要调整颜色范围和去噪参数等。同时,这种方法只能将灰色的花朵着色为蓝色,对于其他颜色的花朵可能需要采用其他着色策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值