-
-
Notifications
You must be signed in to change notification settings - Fork 299
/
474.cpp
128 lines (127 loc) · 4.36 KB
/
474.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
__________________________________________________________________________________________________
sample 4 ms submission
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
//const unsigned int s = strs.size();
array<tuple<int,int>, 601> res;//amount of 0 and 1 for each string
size_t ind_ar = 0;
for (auto it = strs.begin(); it != strs.end(); ++it){
int z = 0, o = 0;
//cout << *it << " ";
for (size_t i = 0; i < it->size(); ++i){
switch ((*it)[i]){
case '1':
++o;
break;
case '0':
++z;
break;
default:
break;
}
}
//cout << z << " " << o << endl;
res[ind_ar] = make_tuple(z, o);
++ind_ar;
}
array<tuple<int,int>,601>::iterator it = &res[strs.size()];
//common sum increasing
sort(res.begin(), it,[m, n](tuple<int,int> a, tuple<int,int>b){
if (get<0>(a) + get<1>(a) == get<0>(b) + get<1>(b)){
if (m <= n) return get<0>(a) < get<0>(b);
else return get<1>(a) < get<0>(b);
}
else return(get<0>(a) + get<1>(a) < get<0>(b) + get<1>(b));
});
// for (auto i = 0; i < strs.size(); ++i){
// cout << get<0>(res[i]) << " " << get<1>(res[i]) << endl;
// }
int result = 0;
ind_ar = 0;
int mc = m, nc = n;
while ((mc > 0 || nc > 0) && ind_ar < strs.size()){
if (mc - get<0>(res[ind_ar]) >= 0 && nc - get<1>(res[ind_ar]) >=0){
mc-=get<0>(res[ind_ar]);
nc-=get<1>(res[ind_ar]);
result+=1;
}
ind_ar+=1;
}
// cout << result <<endl;
// cout << endl;
//sum zeroes increasing
int result1 = 0;
mc = m; nc = n;
sort(res.begin(), it,[](tuple<int,int> a, tuple<int,int>b){
return (get<0>(a) < get<0>(b));
});
// for (auto i = 0; i < strs.size(); ++i){
// cout << get<0>(res[i]) << " " << get<1>(res[i]) << endl;
// }
ind_ar = 0;
while ((mc > 0 || nc > 0) && ind_ar < strs.size()){
if (mc - get<0>(res[ind_ar]) >= 0 && nc - get<1>(res[ind_ar]) >=0){
mc-=get<0>(res[ind_ar]);
nc-=get<1>(res[ind_ar]);
result1+=1;
}
ind_ar+=1;
}
// cout << result1 << endl;
// cout << endl;
//sum ones increasing
int result2 = 0;
mc = m; nc = n;
sort(res.begin(), it,[](tuple<int,int> a, tuple<int,int>b){
return (get<1>(a) < get<1>(b));
});
// for (auto i = 0; i < strs.size(); ++i){
// cout << get<0>(res[i]) << " " << get<1>(res[i]) << endl;
// }
ind_ar = 0;
while ((mc > 0 || nc > 0) && ind_ar < strs.size()){
if (mc - get<0>(res[ind_ar]) >= 0 && nc - get<1>(res[ind_ar]) >=0){
mc-=get<0>(res[ind_ar]);
nc-=get<1>(res[ind_ar]);
result2+=1;
}
ind_ar+=1;
}
// cout << result2 << endl;
// cout << endl;
int r = max(result, result1);
r = max(r, result2);
return r;
}
};
__________________________________________________________________________________________________
sample 9456 kb submission
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
if(strs.size() == 0)
return 0;
int dp[m+1][n+1];
for(int i = 0; i < m+1; ++i){
for(int j = 0; j< n+1; ++j){
dp[i][j] = 0;
}
}
for(auto word: strs){
int zeros = 0, ones = 0;
for(auto c: word){
if(c == '0')++zeros;
else
++ones;
}
for(int i = m; i >= zeros; --i){
for(int j = n; j >= ones; --j){
dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones] + 1);
}
}
}
return dp[m][n];
}
};
__________________________________________________________________________________________________