본문 바로가기
알고리즘!/Dynamic Programming

[C] 1149: RGB거리

by soeayun 2023. 7. 30.

전형적인 Dynamic Programming 문제인걸 알 수 있었는데 그 이유는

subproblem을 여러번 이용해야하기 때문에 이를 위해서 dp[]에 저장해서 이용해야했고

최솟값과 관련된 문제였기 때문이다.

 

이 문제는 i=1일때부터 하나하나씩 해보면 점화식을 구하는 것보다는

i=n일때부터 거꾸로 생각하는게 좀 더 떠올리는게 쉬웠던 것 같다. (2Xn 타일링2와 같이!)

그리고 빨강,초록,파랑 각각을 선택했을때 최선인 경우를 따로따로 저장하는 것이

각각 생각하지 않고  dp[i]일때 최선인 것을 저장하는 것보다 효율적이었는데

이는 똑같은 색깔을 두번 연속 선택하지 못한다면 그 다음에 최선인 경우를 빨리 찾기 위해서이다.

 

#include <stdio.h>

int red[1001];
int green[1001];
int blue[1001];
int dp[1001][3];

  int main(void)
  {
     int n;
    scanf("%d",&n);

    for(int i=1;i<=n;i++)
      {
        scanf("%d %d %d",&red[i],&green[i],&blue[i]);
      }
    dp[1][0]=red[1];
    dp[1][1]=green[1];
    dp[1][2]=blue[1];
    for(int i=2;i<=n;i++)
      {
        dp[i][0]=dp[i-1][1]<dp[i-1][2]? dp[i-1][1]+red[i]:dp[i-1][2]+red[i];
        dp[i][1]=dp[i-1][0]<dp[i-1][2]? dp[i-1][0]+green[i]:dp[i-1][2]+green[i];
        dp[i][2]=dp[i-1][0]<dp[i-1][1]? dp[i-1][0]+blue[i]:dp[i-1][1]+blue[i];
       // printf("%d %d %d\n",dp[i][0],dp[i][1],dp[i][2]);
      }
    

    int min=dp[n][0]<dp[n][1]?dp[n][0]:dp[n][1];
    min=min<dp[n][2]?min:dp[n][2];

    printf("%d",min);
      
  }

 

'알고리즘! > Dynamic Programming' 카테고리의 다른 글

[C] 1003: 피보나치 함수  (0) 2023.08.03
[C] 2748: 피보나치 수 2  (0) 2023.07.30
11727: 2Xn 타일링 2  (0) 2023.07.29
[C] 11726: 2Xn 타일링  (0) 2023.07.25
[C] 2156: 포도주 시식  (0) 2023.07.24