< '프로그래밍 공부/백준 (C++)' 카테고리의 글 목록 (3 Page)

프로그래밍 공부/백준 (C++) 73

[C++ / 백준 11054번] 가장 긴 바이토닉 부분 수열

LIS와 LDS 를 구해 가장 긴 바이토닉  부분 수열을 구하는 문제. 문제의 핵심은 LIS + LDS - 1 값을 찾는 것인데, 간단하게 생각해서 왼쪽에서부터 LIS 를 찾고, 오른쪽에서부터 LIS 를 찾아 더한 후 -1을 해주면 되는 것이다. 각 LIS 를 구한 후 두 개의 dp 벡터에서 해당 인덱스를 넣었을 때 최대 값이 되는 dp_inc + dp_dec 값을 찾아서 출력했다.    #include #include #include using namespace std;#define MOD 10007int main() { vector a(1001, 0); vector dp_inc(1001, 1); vector dp_dec(1001, 1); int N; cin >> N; ..

[C++ / 백준 2225번] 합분해

음... 초반 경우의 수를 찾아 규칙을 통해 점화식을 세웠는데, 점화식은 세워서 정답을 맞췄지만 왜 그 점화식이 도출되는지는 모르는 사태가 발생했다.    따라서 GPT 에게 도움을 요청했다. 경우의 수는 두 가지로 나눌 수 있었는데,dp[i-1][j]: 숫자 i-1을 j개의 숫자로 표현한 후, 마지막 숫자에 1을 더하는 경우.dp[i][j-1]: 숫자 i를 j-1개의 숫자 합으로 표현한 후, 마지막 숫자에 1을 더하는 경우.이렇다고 한다. i = 3, j = 2 일때를 예시로 들자. dp[2][2] = (02 20 11)  = 3dp[3][1] = (3) = 1dp[3][2] = (03 30 12 21 ) = 4 인데  dp[2][2]  에 i를 1 늘리는 경우 1 + 22 + 10 + 3 이고. dp..

[C++ / 백준 1912번] 연속합

DP를 이용하여 풀이했다. 범위가 100,000 이고 시간 제한이 1초이므로 이중 for문을 사용할 수 없다.따라서 카데인 알고리즘을 활용해 풀이했다.배열 하나씩 더해가면서 DP 배열을 구하되  ans 변수를 이용해 최대 값이 나온 dp 배열 인덱스의 값을 동시에 찾도록 했다.그리고 0번째 인덱스 값 혼자가 최대값일 때를 대비해 for문에 들어가지 않는 0번 인덱스를 ans 와 다시 한번 비교해 주었다. 주의할 점은 dp 배열은 (해당 인덱스 - 1 ) + a[해당 인덱스] 값과 a[해당 인덱스] 값 중 누가 큰지를 저장하는 역할이고(0부터 해당 인덱스까지의 원소를 합했을 때의 최대 값) , 실제 답은 ans 에 저장된다는 것이다.  #include #include #include using namesp..

[C++ / 백준 11053번] 가장 긴 증가하는 부분 수열

시간 제한이 1초이고, 수열의 크기가 1000이므로 1000 * 1000을 하였을 때 1억 번을 넘지 않아 이중 반복문으로 풀이 할 것을 예상했다. DP 문제들이 대부분 배열과 점화식을 사용해 해결하다보니 자연스럽게 C 배열로 선언해서 풀었었는데, 다른 풀이를 검색해서 보니 벡터를 사용하는 것이 훨씬 깔끔해 바꾸었다. 핵심은 이중 반복문으로 경우의 수를 전부 순회하며 가장 긴 수열을 만드는 DP 배열 값을 찾는 것이다. 우선 현재 인덱스 i 가 이전 인덱스들의 수보다 당연히 커야 하며, 이전 인덱스의 수보다 i 인덱스 수가 크다면 그때 dp 배열을 검사해  max ( i번째 값, dp[j] + i번째 값) 을 실행해 갱신해 주면 된다. #include #include #include using names..