Ones and Zeroes 1 과 0
4254 단어 알고리즘
지금,네가 각각 지배 하고 있다 고 가정 해라. m 개.
0
화해시키다 n 개. 1
。또 하 나 는 포함 되 어 있다. 0
화해시키다 1
문자열 의 배열.당신 의 임 무 는 주어진 것 을 사용 하 는 것 입 니 다. m 개.
0
화해시키다 n 개. 1
,배열 에 존재 하 는 문자열 의 최대 수 를 찾 을 수 있 습 니 다.매 개 0
화해시키다 1
기껏해야 한 번 사용 된다.주의:
주어진
0
화해시키다 1
수량 을 초과 하지 않 습 니 다. 100
。 주어진 문자열 배열 의 길 이 는 초과 하지 않 습 니 다.
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" 。
사고:이 문 제 는 가방 문제 중 01 가방 의 변형 판 입 니 다.약간 다른 것 은 우리 의 용량 이 m 와 n 으로 바 뀌 었 습 니 다.그 중에서 m 는 남 은 0 의 개 수 를 나타 내 고 n 은 남 은 1 의 개 수 를 나타 내 며 우 리 는 유독 2 차원 으로 줄 이 고 전달 공식 은 다음 과 같 습 니 다.
dp[p][q] = max(dp[p][q], dp[p - result[0]][q - result[1]]+1);
그 중에서 dp 는 길이 가 m*n 인 2 차원 배열 로 그 중에서 dp[m][n]은 m 개 0 과 n 개 1 시의 최 적 화 를 나타 낸다.여기 서 한 마디 더 하고 공간 최 적 화 를 하지 않 는 전달 공식 은 다음 과 같다.
dp[i][p][q] = max(dp[i-1][p][q], dp[i-1][p - result[0]][q - result[1]]+1);
그 중에서 dp[i][p][q]는 첫 번 째 요소 부터 i 번 째 요소 까지 가방 용량 이 p 개 0 과 q 개 1 이 남 았 을 때의 최 적 화 를 나타 낸다.여기 서 모든 상품 의 가 치 는 1 이 므 로 우리 의 목 표 는 모든 상품 중에서 일부 상품 을 선택 하여 가방 용량 p 와 q 를 초과 하지 않 는 상황 에서 가 치 를 최대 로 하 는 것 이다.이것 은 3 차원 배열 이다.우 리 는 그것 을 2 차원 배열 로 최적화 시 켰 다.위의 공식 과 같다.
참조 코드 는 다음 과 같 습 니 다.
class Solution {
public:
vector count(string &s) {
if (s.size() == 0) {
return { 0,0 };
}
int sum_zero = 0;
int sum_one = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') {
sum_zero++;
}
else {
sum_one++;
}
}
return { sum_zero,sum_one };
}
int findMaxForm(vector& strs, int m, int n) {
int len = strs.size();
int res = 0;
if (len == 0) {
return 0;
}
int **dp = new int *[m + 1];
for (int i = 0; i < m + 1; i++) {
dp[i] = new int[n + 1];
}
for (int i = 0; i < m + 1; i++) {
for (int j = 0; j < n + 1; j++) {
dp[i][j] = 0;
}
}
for (int i = 0; i < len; i++) {
for (int p = m; p >= 0; p--) {
for (int q = n; q >= 0; q--) {
vector result = count(strs[i]);
if (p >= result[0] && q >= result[1]) {
dp[p][q] = max(dp[p][q], dp[p - result[0]][q - result[1]]+1);
}
}
}
}
res = dp[m][n];
for (int i = 0; i < m + 1; i++) {
delete[] dp[i];
}
delete[] dp;
return res;
}
};
컴퓨터 업계 에서 우 리 는 항상 유한 한 자원 으로 가장 큰 수익 을 얻 는 것 을 추구한다.
지금,네가 각각 지배 하고 있다 고 가정 해라. m 개.
0
화해시키다 n 개. 1
。또 하 나 는 포함 되 어 있다. 0
화해시키다 1
문자열 의 배열.당신 의 임 무 는 주어진 것 을 사용 하 는 것 입 니 다. m 개.
0
화해시키다 n 개. 1
,배열 에 존재 하 는 문자열 의 최대 수 를 찾 을 수 있 습 니 다.매 개 0
화해시키다 1
기껏해야 한 번 사용 된다.주의:
주어진
0
화해시키다 1
수량 을 초과 하지 않 습 니 다. 100
。 주어진 문자열 배열 의 길 이 는 초과 하지 않 습 니 다.
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" 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.