문제 설명

A 의 수열이 있을 때, |Ai - Ai+1| ~ |An-2 - An-1| 의 합 중 최대값을 구하면 된다.

풀이

완전 탐색으로 다 확인했다.
1. O(N!) 이여서 그렇게 오래 걸리지도 않는다.
사용한지 안한지는 비트마스크를 이용해서 했다.

코드

시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초256 MB47832862226761.303%

문제

N개의 정수로 이루어진 배열 A가 주어진다. 이 때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최대값을 구하는 프로그램을 작성하시오.

|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|

입력

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

출력

첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.

예제 입력 1 

6
20 1 15 8 4 10

예제 출력 1 

62

출처


문제 설명

1. LIS 의 기본문제
2. LIS 는 가장 긴 증가하는 부분수열을 구하는 알고리즘이다.

풀이

dp 와 arr 배열을 둬서 그 전의 박스들을 모두 확인한다.
1. dp 배열에는 현재 그 박스위치에서 가장 많은 박스의 개수를 저장하고
2. arr 배열에서는 박스의 크기를 저장한다.
3. arr[현재 박스위치] > arr[이전의 박스 모두들] 을 해서 가장 높은 dp[이전의 박스 모두들] 를 골라 + 1 해준게 dp[현재 박스위치] 에 들어간다.

증명

1. dp[0] = 1
풀이의 3을 0 ~ N 까지 한게 증명의 설명이 되겠다.

코드

문제

정육면체 모양의 상자들이 일렬로 늘어서 있다. 상자들마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 있다. 예를 들어 앞에서부터 순서대로 크기가 (1, 5, 2, 3, 7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자들을 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법은 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자들을 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.

상자들의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.

입력

파일의 첫 번째 줄은 상자의 개수 n (1≤n ≤1000)을 나타낸다. 두 번째 줄에는 각 상자들의 크기가 순서대로 주어진다.

출력

첫째 줄에 한 줄에 넣을 수 있는 최대의 상자 개수를 출력한다.

예제 입력 1 

8
1 6 2 5 7 3 5 6

예제 출력 1 

5


문제 설명

0, 0 에서 N - 1, N -1 로 가는 경우의 수를 모두 구하면 된다.
이동은 오른쪽 또는 아래로만 가능하다.

풀이, 증명

입력과 동시에 답을 구했다. O(N^2)
1. dp[0][0] 은 1 로 초기화 한다.
2. 0,0 에서 오른쪽 또는 아래로 갈 수 있다면 이동한 곳에 값을 dp[0][0] 을 넣어준다.
그러면 각각 1 이 들어가게 된다.
3. for loop 이 돌면서 2 번 0,0 에 i,j 를 대입해서 순서대로 실행하게 되면 마지막 dp[N-1][N-1] 에는 답이 들어가게 된다.
위로 또는 왼쪽으로 못가기 때문에 순서대로 for loop 을 돌면서 답을 구할 수 있다.
왜냐하면 미리 답을 넣어놓고 거기에 도착하는 순간은 모든 경로를 다 확인했기 때문이다. 오른쪽 또는 아래로 갈 수 있는것은 j, i 를 더한다는게 된다.

설명이 부족했지만 알아서 이해하시면 됩니다.

코드

문제

N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다.

각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로 점프를 하는 두 경우만 존재한다.

가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 이동할 수 있는 경로의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 오른쪽 아래 칸에는 항상 0이 주어진다.

출력

가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 문제의 규칙에 맞게 갈 수 있는 경로의 개수를 출력한다. 경로의 개수는 263-1보다 작거나 같다.

예제 입력 1 

4
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0

예제 출력 1 

3

힌트


+ Recent posts