728x90
반응형

다이나믹프로그래밍 20

[백준/DP/C++] 1003번 피보나치 함수

문제는 여기! 문제풀이 방법 arr 함수를 선언해주고 arr[N][0] 에는 fibonacci(N)을 구할때 출력되는 0의수 arr[N][1] 에는 fibonacci(N)을 구할때 출력되는 1의수로 정하고 문제를 풀었다 #include using namespace std; int T; int arr[41][2]; void callZero(){ arr[0][0] = 1; arr[0][1] = 0; arr[1][0] = 0; arr[1][1] = 1; for(int i=2; i> T; for(int i=0; i> N; cout

[백준/DP/C++] 1149번 RGB거리 *

문제는 여기! #include using namespace std; int N; int cost[3]; int house[1001][3]; void input() { cin >> N; for(int i=0; i> cost[0] >> cost[1] >> cost[2]; if(i==0){ house[0][0] = cost[0]; house[0][1] = cost[1]; house[0][2] = cost[2]; } else { house[i][0] = min(house[i-1][1], house[i-1][2]) + cost[0]; house[i][1] = min(house[i-1][0], house[i-1][2]) + cost[1]; house[i][2] = min(house[i-1][0], house[i-1..

[백준/DP/C++] 1463번 1로 만들기

문제는 여기! 문제 해결 방법 DP[n] : n을 만드는데 사용되는 연산의 최소 횟수 로 정하고 Dp{1] = 0,DP[2] = 1, DP[3] = 1, 나머지는 N으로 초기화를 했다. 그리고 n이 3으로 나누어 떨어지면 DP[n]과 DP[n/3]+1 의 최소값을 비교해서 DP[n]에 입력, n이 2로 나누어 떨어지면 DP[n]과 DP[n/2]+1 의 최소값을 비교해서 DP[n]에 입력, DP[n]과 DP[n-1]+1 의 최소값을 비교해서 DP[n]에 입력해서 문제를 해결했다. #include using namespace std; int N; int dp[1000001]; void solve(){ for(int i=4; i> N; fill(dp, dp+N+1, N); dp[1] = 0; dp[2] = 1..

[백준/DP/C++] 1699번 제곱수의합

https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net 처음에는 n보다 작은 제곱수 중 가장 큰 제곱수부터 차례로 빼는 방법을 사용했는데 그러면 43같은 반례가 나왔다 ex) 43 = 6² + 2² + 1² + 1² + 1² (5개) 43 = 5² + 3² + 3² (3개) 그래서 dp[n]은제곱수 항의 최소개수로 정하고 n에서 작은 제곱수부터 빼주면서 dp[n] = dp[n - 제곱수] + 1 의 최소값을 구했..

알고리즘 2022.12.31

[백준/DP/C++] 2579번 계단 오르기

https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 한번에 한계단이나 두계단만 오를 수 있고 연속으로 세계단은 오를 수 없기 때문에 n-3계단에서 n-1을 건너 오는 경우(한계단)와 n-2에서 오는 경우(두계단)의 경우가 있을 수 있다 이 중 점수의 최대값을 구하면 된다 #include using namespace std; int n; int dp[301] = {0}, a[301] ={0}; int main(void) { cin >> n; for(int i=1..

알고리즘 2022.12.30

[백준/DP/C++] 11055번 가장 큰 증가 부분 수열

https://www.acmicpc.net/problem/11055 11055번: 가장 큰 증가 부분 수열 수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수 www.acmicpc.net dp는 수열 a와 같이 초기화해준다 전의 수열 값과 비교하면서 자신의 값보다 작으면 그 값의 dp값에 자신의 값을 더한 것과 자신의 dp값을 비교해 더 큰 값을 넣어주면 된다 #include using namespace std; int n; int dp[1001] = {0}, a[1001] ={0}; int main(void) { cin ..

알고리즘 2022.12.29

[백준/DP/C++] 11052번 카드 구매하기

https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net dp[n]은 n개를 구입 할 때 최대 금액으로 정하고 n=1 은 p[1]로 초기화한다 그리고 n=2부터 dp[n] = dp[n-i] + dp[i] 의 점화식을 이용해 풀면 된다 #include using namespace std; int n; int p[1001], dp[1001]; int main(void) { cin >> n ; for(int i=1; i> p[i]; } dp[1] = p[1]; fo..

알고리즘 2022.12.28

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

https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 전에 풀어봤던 문제라서 쉽게 해결됐다 배열 a에 수열을 넣고 dp배열에는 i번째 값을 포함하는 가장 긴 수열의 수를 넣는다 dp배열은 1로 초기화하고 a값을 차례대로 비교하면서 자신의 값보다 작은 값의 dp값에 1을 더해준다 #include using namespace std; int n; int dp[1001] = {..

알고리즘 2022.12.28

[백준/DP/C++] 9465번 스티커

https://www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net 스티커 점수를 담는 배열 arr[i][j] 와 (i. j)를 포함하는 스티커 점수의 최대값 dp[i][j] 배열을 선언해준다 j열의 점수를 계산하면 j-1 대각선에 있는 점수랑 j-2 대각선에 있는 점수 중 큰 값을 비교해 자신의 값과 더해주면 된다 #include using namespace std; int t, n; int dp[2][100001], arr[2][100001]; vo..

알고리즘 2022.12.27

[백준/DP/C++] 9461번 파도반 수열

https://www.acmicpc.net/problem/9461 9461번: 파도반 수열 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 www.acmicpc.net 처음에는 숫자 배열만 보고 p[n] = p[n-2] + p[n-3] 라고 생각했는데 직접 그림을 그려보니 p[n] = p[n-1] + p[n-5] 였다 그리고 어느순간 int의 범위를 벗어나서 배열은 long long 형으로 선언했다 #include using namespace std; int tc; long long a[101] ={0,1,1,1,2,2}; int main(void) { cin >> ..

알고리즘 2022.12.26
728x90
반응형