Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 지도 여러개
- solved.ac플래티넘
- solved.ac골드
- 알고리즘문제풀이
- 최소스패닝트리
- 정렬
- JS스터디
- JS
- pccp기출문제
- React.StrictMode
- 알고리즘 문제풀이
- 2023카카오블라인드코테
- c++
- 과제진행하기
- 두원사이의정수쌍
- div2개
- DP
- 5강클로저
- 백준 알고리즘
- 타겟넘버
- 백준알고리즘
- Lv2
- 프로그래머스
- Lv3
- 우박수열정적분
- 이중지도
- [pccp 기출문제]
- 비트마스크
- 코어자바스크립트
- 스택
Archives
- Today
- Total
호지
[백준 알고리즘] 2342번 Dance Dance Revolution 문제풀이 c++ 본문
처음에 DFS로 풀었으나 시간초과로 틀렸다. DP문제는 해도해도 헷갈린다ㅜ
dp[n][i][j]는 n번째 움직임에서 왼쪽발이 i에 있고, 오른쪽이 j에 있을때 power의 최솟값을 뜻한다.
1번째 움직임에서 가능한 경우는 왼발이 moves[1]에 있거나 오른발이 moves[1]에 있을 때이다.
따라서 dp의 초기값은 dp[1][moves[1]][0] = 2, dp[1][0][moves[1]] = 2이다. (0에서 이동한 경우엔 power가 2)
2~n까지 탐색을 통해 dp값을 채우면 dp[n]의 최솟값이 구하고자하는 power의 최솟값이다.
양발은 같은 위치에 있으면 안 되므로 if(moves[x] !=i) , if(moves[x] !=j)로 확인한다.
x1-> x2의 이동의 power계산은 scores[x1][x2]를 확인하도록 scores배열을 선언했다.
#include <iostream>
using namespace std;
int dp[100001][5][5];
int moves[100001];
int scores[5][5] = {{0,2,2,2,2},{0,1,3,4,3},{0,3,1,3,4},{0,4,3,1,3},{0,3,4,3,1}};
int main(){
int n = 1;
while(1){
cin >> moves[n];
if(moves[n++] == 0){
break;
}
}
dp[1][0][moves[1]] = 2;
dp[1][moves[1]][0] = 2;
for(int x=2; x<=n; x++){
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(dp[x-1][i][j] != 0){
if(moves[x] != j)
if(dp[x][moves[x]][j] == 0)
dp[x][moves[x]][j] = dp[x-1][i][j] + scores[i][moves[x]];
else
dp[x][moves[x]][j] = min(dp[x][moves[x]][j], dp[x-1][i][j] + scores[i][moves[x]]);
if(moves[x] != i)
if(dp[x][i][moves[x]] == 0)
dp[x][i][moves[x]] = dp[x-1][i][j] + scores[j][moves[x]];
else
dp[x][i][moves[x]] = min(dp[x][i][moves[x]], dp[x-1][i][j] + scores[j][moves[x]]);
}
}
}
}
int res = 400001;
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(dp[n][i][j] != 0)
res = min(res,dp[n][i][j]);
}
}
if(res == 400001)
res = 0;
cout << res;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘] 2473번 세 용액 문제풀이 (0) | 2022.11.28 |
---|---|
[백준 알고리즘] 2467번 용액 문제풀이 c++ (0) | 2022.06.18 |
[백준 알고리즘] 2252번 줄세우기 문제풀이 c++ (0) | 2022.06.10 |
[백준 알고리즘] 2239번 스도쿠 문제풀이 (0) | 2022.06.08 |
[백준 알고리즘] 2166번 다각형의 면적 (0) | 2022.06.08 |
Comments