백준: Silver1⑤ - 1303, 1309

1 분 소요


</br> 얘네만 다 풀면 골드 5
</br>

1303: 전쟁 - 전투

https://www.acmicpc.net/problem/1303

아군과 적군의 위력 구하기

void func(int i, int j){
    d++;
    if( !check[i+1][j] && mmap[i+1][j] == mmap[i][j] ){
        check[i+1][j] = 1;
        func(i+1, j);
    }
    if( !check[i][j+1] && mmap[i][j+1] == mmap[i][j] ){
        check[i][j+1] = 1;
        func(i, j+1);
    }
    if( !check[i-1][j] && mmap[i-1][j] == mmap[i][j] ){
        check[i-1][j] = 1;
        func(i-1, j);
    }
    if( !check[i][j-1] && mmap[i][j-1] == mmap[i][j] ){
        check[i][j-1] = 1;
        func(i, j-1);
    }
}

// in main()
    int W = 0, B = 0;
    for(int i = 1; i < n+1; i++){
        for(int j = 1; j < m+1; j++){
            if( !check[i][j] ){
                d = 0;
                check[i][j] = 1;
                func(i, j);
                if( mmap[i][j] == 0 ) W += pow(d, 2);
                else B += pow(d, 2);
            }
        }
    }


    cout << W << ' ' << B << endl;

진짜 별 거 없고 또 뭉친 거 크기 구하고 제곱해서 더하면 끝
</br>

1309: 동물원

https://www.acmcpc.net/problem/1309

사자 우리 경우의 수 구하기

    dp[1] = 3;
    dp[2] = 7;

    for(int i = 3; i < n+1; i++){
        dp[i] = (2*dp[i-1] % 9901 + dp[i-2] % 9901) % 9901;
    }

    cout << dp[n] << endl;

이렇게 푸는 게 맞는 건지는 모르겠지만??
어째 규칙을 찾으니 dp[i] = 2*dp[i-1] + dp[i-2]가 나와서 해 보니 맞았다.
중간 중간 모듈러도 해 주면 되고
</br>

그래도 일단 좀 더 생각해 보니, 사자가 왼쪽 오른쪽 둘 중 하나만 들어가거나 없어야 한다. 둘 다 없는 걸 0, 왼쪽만을 1, 오른쪽만을 2라 하고, 한 줄씩 더해진다고 생각하면

dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]
ex)
..  ..  ..
..  ..  ..
00  10  01

마찬가지로 다른 경우들도

dp[i][1] = dp[i-1][0] + dp[i-1][2]
ex)
..  ..
..  ..
00  01
10  10

dp[i][2] = dp[i-1][0] + dp[i-1][1]

그리고 얘네를 다 더한 dp[i][0] + dp[i][1] + dp[i][2]가 답이 되겠다.
</br>

그런데… 그럼 저 규칙이랑은 무슨 연관이 있을까 봤는데

dp[i] = dp[i][0] + dp[i][1] + dp[i][2]
      = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]
        + dp[i-1][0] + dp[i-1][2]
        + dp[i-1][0] + dp[i-1][1]
      = 3*dp[i-1][0] + 2*dp[i-1][2] + 2*dp[i-1][2]
      = 2*dp[i-1] + dp[i-1][0]

까지는 나온다.
그럼 dp[i-1][0] == dp[i-2]가 맞는 지를 보면

dp[i-1][0] == dp[i-2]
dp[i][0] == dp[i-1]
         == dp[i-1][0] + dp[i-1][1] + dp[i-1][2]

해서 맞네~~

처음엔 운빨 비스무리로 풀긴 했는데 아무튼 이런 dp 식을 세울 수 있는 문제였다
</br>


골드 5가 되었다~~ 805점이다
실버 5에서 시작한 지 6일 째다
이제 골드 5 문제를 풀지, 아니면 실버들 좀 더 풀지 생각해 봐야 겠다
</br>

댓글남기기