문제에서 구하는 수는 주어진 수를 이진수로 표현했을 때 1의 개수와 같다는 것을 쉽게 알 수 있기 때문이다.
이를 바탕으로 구현하면 코드를 간단히 작성할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using std::cin; using std::cout;
int main()
{
int x = 0, ans = 0;
cin >> x;
while (x > 0) {
if (x & 1) ans += 1;
x >>= 1;
}
cout << ans;
return 0;
}
수열을 구성하는 수는 모두 1000 이하의 양의 정수이므로, 크기 1000짜리 배열을 만들어 숫자가 들어올 때마다 배열의 해당 숫자번째 원소를 그 수로 끝나는 부분수열 중 합이 최대인 경우로 갱신해나가주면 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using std::cin;
using std::cout;
int nums[1001];
int main()
{
int N; cin >> N;
int x;
for (int _ = 0;_ < N;_++) {
cin >> x;
if (nums[x] < x) nums[x] = x;
for (int i = x - 1; i >= 0;i--) {
if (nums[i] + x > nums[x]) nums[x] = nums[i] + x;
}
}
int ans = 0;
for (int i = 0;i <= 1000;i++) {
if (ans < nums[i]) ans = nums[i];
}
cout << ans;
return 0;
}