힘: 1269 제자리에 머무르는 방안 수

1964 단어 LeetCode

느낌은 dp일 것 같지만 처음에는 귀속 처리만 생각할 수 있다.
class Solution {
public:
    int ans = 0;

    void dfs(int steps, int direction, int arrLen){
        if(steps == 0)
        {
            if(direction == 0)
                ans++;
            else
                return;
        }
        else
        {
            if(arrLen > 1 + direction)
                dfs(steps - 1, direction + 1, arrLen);
            if(0 <= direction - 1)
                dfs(steps - 1, direction - 1, arrLen);
            dfs(steps - 1, direction, arrLen);
        }
    }

    int numWays(int steps, int arrLen) {
        dfs(steps, 0, arrLen);
        return ans;
    }
};

돌아가는 사고방식은 간단하지만 디테일이 하나 있다. 바로 arrlen은 0에서 시작하기 때문에 최대 길이는 arrlen이다. - 1.귀환은 간단하지만 시간을 초과하기 쉽다. 이전의 지식점인'귀환에서 동적 기획까지'를 회상하면 두 개의 변수는 dp의 수조가 2차원 표로 상태를 묘사해야 한다는 것을 설명한다.
 
class Solution {
public:

    const int mod = 1e9+7;

    int numWays(int steps, int arrLen) {
        int ans = 0;

        //steps arrLen ,  dp 
        arrLen = min(steps, arrLen);
        vector>dp(steps + 1, vector(arrLen, 0));

        //dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] + dp[i][j + 1]
        // , 
        // 

        dp[0][0] = 1;
        for (int i = 1; i <= steps; ++i) {
            for (int j = 0; j < arrLen; ++j) {
                for (int k = -1; k <= 1; ++k) {
                    // , 
                    if (j - k >= 0 && j - k < arrLen) {
                        dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;
                    }
                }
            }
        }
        for(int i = 0; i < steps + 1; ++i)
        {
            for(int j = 0; j < arrLen; ++j)
            {
                cout << dp[i][j] << " ";
            }
            cout << endl;
        }
        return dp[steps][0];
    }
};

// steps = 4, arrLen = 2  , 5 2 

좋은 웹페이지 즐겨찾기