[백준/BOJ] 3976. 역습 [Silver 2]

jychan99·2021년 12월 27일
0
post-thumbnail
  1. 역습

문제출처 : https://www.acmicpc.net/problem/3976

와 이문제 역대급으로 어려웠던것 같다. 성공확률 은 82퍼였는데, 고인물들만 풀어서 성공확률이 높지않았나.. 싶더라

나도 블로그를 보고 참고해서 작성했다.

참고블로그 : https://cocoon1787.tistory.com/379

code

#include <iostream>
#include <algorithm>
using namespace std;

int pass[2][100001] = {};
int dribble[2][100001] = {};
int dp[2][100001] = {};
int main()
{
    int c, n, l1, l2, s1, s2, i;

    cin >> c;

    while (c--)
    {
        cin >> n >> l1 >> l2 >> s1 >> s2;

        for (int i = 0; i < n-1; i++)
            cin >> pass[0][i];
        for (int i = 0; i < n-1; i++)
            cin >> dribble[0][i];
        for (int i = 0; i < n-1; i++)
            cin >> pass[1][i];
        for (int i = 0; i < n-1; i++)
            cin >> dribble[1][i];

        dp[0][0] = l1;
        dp[1][0] = l2;

        for (i = 1; i < n; i++)
        {
            dp[0][i] = min(dp[0][i-1]+dribble[0][i-1],dp[1][i-1]+pass[1][i-1]);
            dp[1][i] = min(dp[1][i-1]+dribble[1][i-1],dp[0][i-1]+pass[0][i-1]);
        }
        cout << min(dp[0][n-1] + s1, dp[1][n-1] + s2) << '\n';
    }

    return 0;
}

여기서는 dp[0]는 스트라이커 1,dp[1]은 스트라이커 2의 시점에서 케이스를 나눠서 생각했다.

수비수에게 패스받은 난이도를 각각 dp[0][0],dp[1][0]에 저장하고,

dp[0][i] 부터는 dp[0][i-1]부터 드리블을 해온경우, dp[1][i-1]에게서 패스를 받은경우중 최소값을 저장한다.

그리고 스트라이커 1 (dp[0])와 스트라이커 2(dp[1])의 난이도를 비교해서 최솟값을 출력한다.

나는 if문을 몇개써야하나 이생각에 사로잡혀서 코드가 엄청길어졌었는데, 이렇게 간단?하지는 않지만 비교적으로 간단하게 표현가능하다는거에 놀랐다....

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐥

0개의 댓글