문제

해결방안

dp[출석일수][지각수][연속빠진수]
로 일단 배열을 세팅한다.

1)ㅁㅁㅁㅁㅁ출석 (맨마지막날 출석한 경우)
dp[출석일수][지각수][0]
=dp[출석일수-1][지각수][0,1,2] #연속빠진수는 어차피 마지막날 출석이면 0으로 초기화

2)ㅁㅁㅁㅁㅁ지각 (맨마지막날 지각한 경우)
dp[출석일수][1][0]=dp[출석일수-1][0][0,1,2] #맨마지막날 지각하면 어차피 연속빠진수는 0으로 초기화 됨

3)ㅁㅁㅁㅁㅁ연속빠진수 (맨마지막날 결석한 경우)
dp[출석일수][0][2]=dp[출석일수-1][0][1]
dp[출석일수][0][1]=dp[출석일수-1][0][0]
dp[출석일수][1][2]=dp[출석일수-1][1][1]
dp[출석일수][1][1]=dp[출석일수-1][1][1]

코드

#include <iostream>
int mod = 1000000;
using namespace std;

int main()
{
    int k;
    int ***dp;
    int x,y,z;
    int i,j,m;
    int result = 0;;
    cin >> x;
    dp = new int **[x+1];

    for (i = 0; i < x+1; i++) {
        dp[i] = new int *[2];
        for (j = 0; j < 2; j++) {
            dp[i][j] = new int[3];
        }
    }

    for (i = 0; i < x + 1; i++) {
        for (j = 0; j < 2; j++) {
            for (m = 0; m < 3; m++) {
                dp[i][j][m] = 0;
            }
        }
    }


    dp[0][0][0] = 1;
    dp[1][0][0] = 1;
    dp[1][0][1] = 1;
    dp[1][1][0] = 1;

    for (i = 2; i < x + 1; i++) {
        for (j = 0; j < 2; j++) {
            for (k = 0; k < 3; k++) {
                dp[i][j][0] += dp[i - 1][j][k];
                dp[i][j][0] %= mod;
                if (k < 2) {
                    dp[i][j][k + 1] += dp[i - 1][j][k];
                    dp[i][j][k + 1] %= mod;
                }
                if (j == 0) {
                    dp[i][1][0] += dp[i - 1][0][k];
                    dp[i][1][0] %= mod;
                }
            }
        }
    }
    for (j = 0; j < 2; j++) {
        for (m = 0; m < 3; m++) {
            result += dp[x][j][m];
        }
    }

    cout << result%mod;

    return 0;
}

+ Recent posts