强行求出了解,主要记录每一个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;
}
};