动态规划之二维背包及杂项

一和零

一和零

在这里插入图片描述
思路

  • 状态表示:dp[i][j][k]表示,从前i个元素中选,字符0不超过j,字符1不超过k,所有选法中,最大的长度;
  • 状态转移方程:根据第i个位置的状态来分析,我们令第i个元素中0的个数为a1的个数为b
    • 不选第i个元素,则dp[i - 1][j][k]
    • 选第i个元素,则dp[i - 1][j - a][k - b] + 1(但此时需要特判,即j >= a, k >= b)
  • 初始化:因为j, k在填表时会特判,所以我们仅考虑i = 0,此时从0个元素中选,空集,所以为0
  • 填表顺序:i从小到大即可;
  • 返回值:dp[len][m][n]
    C++代码
class Solution 
{
   
public:
    int findMaxForm(vector<string>& strs, int m, int n) 
    {
   
        int len = strs.size();
        vector<vector<vector<int>>> dp(len + 1, vector<vector<int>>((m + 1), vector<int>(n + 1)));
        for(int i = 1; i <= len; i++)
        {
   
            // 0       1
            int a = 0, b = 0;
            for(auto s : strs[i - 1])
                if(s == '0') a++;
                else b++;
            for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值