https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
int main(){
int dp[2][20001];
int s[2][200001];
int T;
int n;
cin>>T;
while(T--){
cin>>n;
for(int i = 0; i < 2; i++){
for(int j = 0; j < n; j++){
cin >> s[i][j];
}
}
dp[0][0] = s[0][0];
dp[1][0] = s[1][0];
dp[0][1] = s[0][1] + dp[1][0];
dp[1][1] = s[1][1] + dp[0][0];
for(int i = 2; i < n; i++){
dp[0][i] = s[0][i] + max(dp[1][i-1], dp[1][i-2]);
dp[1][i] = s[1][i] + max(dp[0][i-1], dp[0][i-2]);
}
cout<<max(dp[0][n-1], dp[1][n-1])<<endl;
}
return 0;
}

위 사진에서 1칸씩 대각선으로 가는 방법과 2칸을 건너뛰는 대각선으로 가는 방법이 있습니다.
이것으로 점화식을 세울 수 있습니다.
dp[0][i] = s[0][i] + max(dp[1][i-1], dp[1][i-2])

이 그림의 점화식은 dp[1][i] = s[1][i] + max(dp[0][i-1], dp[0][i-2])로 세울 수 있습니다
첫 번째 그림의 점화식으로 나타나지는 값과 두 번째 그림의 점화식으로 나타나는 값의 최소를 출력을 합니다.
사실 이 문제는 BFS로 해결하려고 하였지만, N의 최대값이 10만으로 주어져 BFS를 사용하게 되면
시간초과가 날 것으로 생각해 해결 방법을 DP로 바꿨습니다.
'BOJ 백준 > Class 4' 카테고리의 다른 글
백준 1629, 곱셉(C, C++) (0) | 2022.01.21 |
---|---|
백준 1991번, 트리 순회(C, C++) (0) | 2022.01.21 |
백준 1916번, 최소비용 구하기(C, C++) (0) | 2022.01.21 |
백준 11659번, 구간 합 구하기 5(C, C++) (0) | 2022.01.20 |
백준 11053번, 가장 긴 증가하는 부분 수열( C, C++) (0) | 2022.01.20 |