• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Niro Einteson
文可提笔安天下 武可上马定乾坤
博客园    首页    新随笔    联系   管理    订阅  订阅

474. 一和零

474. 一和零

在计算机界中,我们总是追求用有限的资源获取最大的收益。

现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。

你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。

注意:

  1. 给定 0 和 1 的数量都不会超过 100。
  2. 给定字符串数组的长度不会超过 600。

示例 1:

输入: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
输出: 4

解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。

示例 2:

输入: Array = {"10", "0", "1"}, m = 1, n = 1
输出: 2

解释: 你可以拼出 "10",但之后就没有剩余数字了。更好的选择是拼出 "0" 和 "1" 。

代码-顺序
 1 class Solution {
 2 public:
 3     int findMaxForm(vector<string>& strs, int m, int n) {
 4         int dp[601][101][101];
 5         int len=strs.size();
 6         for(int i=1;i<=len;i++){
 7             //计算 字符串的0,1值:可提去成函数
 8             int zeros=0,ones=0;
 9             for(int j=0;j<strs[i-1].size();j++){
10                 if(strs[i-1][j]=='0') zeros++;
11                 else ones++;
12             }
13             for(int j=0;j<=m;j++){
14                 for(int k=0;k<=n;k++){
15                     //顺序计算:只和上一行的数据有关系,所以保持上一行数据(可优化)
16                     dp[i][j][k]=dp[i-1][j][k];
17                     //之间的数据保持,之后的数据变化
18                     if(j>=zeros&&k>=ones){
19                         dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-zeros][k-ones]+1);
20                     }
21                 }
22             }
23         }
24         return dp[len][m][n];
25     }
26 };

代码-逆序


 1 class Solution {
 2 public:
 3     int findMaxForm(vector<string>& strs, int m, int n) {
 4         //要进行初始化,全为0
 5         int dp[101][101]={0};//vector<vector<int>> dp(m + 1,vector<int>(n + 1,0));
 6         int len=strs.size();
 7         for(int i=0;i<len;i++){
 8             //计算 字符串的0,1值:可提去成函数
 9             int zeros=0,ones=0;
10             for(int j=0;j<strs[i].size();j++){
11                 if(strs[i][j]=='0') zeros++;
12                 else ones++;
13             }
14             for(int j=m;j>=zeros;j--){//逆序; 从m->zeros;zeros之下的不变
15                 for(int k=n;k>=ones;k--){//同理
16                     dp[j][k]=max(dp[j][k],dp[j-zeros][k-ones]+1);
17                 }
18             }
19         }
20         return dp[m][n];
21     }
22 };

 

 
posted @ 2020-03-21 14:36  Nirogo  阅读(298)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3