474. Ones and Zeroes

优化DP求解方法

强行求出了解,主要记录每一个dp空格的值以及有值的dp的位置。但是求解的过程太慢了。于是参考了discuss,我的天,基本都是一样的,但是它的DP方程更加简洁明了。。。。

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {

        int maxForm=0;

        vector<vector<int>> dp;
        vector<int> temp(n+1,0);//dp[0][0]~dp[m][n]
        for(int i=0;i<m+1;i++)
            dp.push_back(temp);

        set<pair<int,int>> hasValue;
        pair<int,int> temp1(m,n);//m---0;n---1
        hasValue.insert(temp1);

        for(int i=0;i<strs.size();i++)
        {
            int one=0;
            int zero=0;
            for(int j=0;j<strs[i].size();j++)
                one+=strs[i][j]-'0';
            zero=strs[i].size()-one;
            //cout<<zero<<" "<<one<<endl;

            set<pair<int,int>> newHasValue;
            for(set<pair<int,int>>::iterator it=hasValue.begin();it!=hasValue.end();it++)
            {
                if(it->first>=zero&&it->second>=one)
                {
                    dp[it->first-zero][it->second-one]=max(dp[it->first-zero][it->second-one],dp[it->first][it->second]+1);

                    maxForm=max(maxForm,dp[it->first-zero][it->second-one]);

                    pair<int,int> temp(it->first-zero,it->second-one);
                    newHasValue.insert(temp);
                }    
            }

            for(set<pair<int,int>>::iterator it=newHasValue.begin();it!=newHasValue.end();it++)
                hasValue.insert(*it);


        }

        /*for(int i=0;i<dp.size();i++)
        {
            for(int j=0;j<dp[i].size();j++)
                cout<<dp[i][j]<<" ";
            cout<<endl;
        }*/

        return maxForm;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值