[일 일 1 문제] 47. 연말 상여금 (동적 기획, 지역 dp)

9911 단어 매일 한 문제
1. 제목 출처
링크: 연말 보너스 출처: 우 객 망
2. 제목 설명
샤 오 둥 이 있 는 회 사 는 연말 상여금 을 주 려 고 하 는데 샤 오 둥 은 마침 최고 복 지 를 받 았 다. 그 는 회사 연례 회의 에서 추첨 게임 에 참여 하려 고 한다. 게임 은 6 * 6 의 바둑판 에서 진행 되 고 그 위 에 36 개의 가치 가 다른 선물 이 놓 여 있다. 작은 바둑판 위 에 선물 이 하나 놓 여 있다. 그 는 왼쪽 상단 에서 게임 을 시작 해 야 한다. 매번 아래로 또는 오른쪽으로 한 걸음 만 이동 할 수 있다.오른쪽 아래 에 도착 하면 멈 추고 가 는 길에 있 는 격자 안의 선물 을 작은 동쪽 에서 도 받 을 수 있 습 니 다. 작은 동쪽 이 가장 가치 있 는 선물 을 받 을 수 있 도록 알고리즘 을 설계 하 세 요.
6 * 6 의 행렬 board 를 지정 합 니 다. 그 중에서 모든 요 소 는 해당 칸 의 선물 가치 이 고 왼쪽 상단 은 [0, 0] 입 니 다. 얻 을 수 있 는 최대 가 치 를 되 돌려 주 십시오. 모든 선물 가치 가 100 보다 적 고 1000 보다 적 음 을 보증 합 니 다.
3. 문제 해석
이 문 제 는 동적 기획 을 사용 하여 해답 을 구 해 야 한다.정의 f (i, j) 는 왼쪽 상단 에서 좌표 (i, j) 로 가면 얻 을 수 있 는 최대 보상 을 표시 합 니 다.왼쪽 상단 에서 오른쪽 하단 으로 가 는 모든 경 로 를 검색 하여 가장 좋 은 경 로 를 찾 습 니 다.f (i, j) 는 세 가지 상황 으로 나 뉜 다.
첫 번 째 열: f (i, 0) = f (i - 1, 0) + board (i, 0) 첫 번 째 줄: f (0, j) = f (0, j - 1) + b (0, j) 다른 위치: f (i, j) = max {f (i - 1, j), f (i, j - 1)} + board (i, j)
마지막 으로 오른쪽 아래 의 값 을 되 돌려 줍 니 다.
4. 코드 전시
class Bonus {
public:
    int getMost(vector<vector<int> > board) {
        // write code here
        int length = board.size();
        int wideth = board[0].size();
        vector<vector<int>> allPrice;
        for (int i = 0; i < length; ++i) {
            vector<int> tmp(wideth, 0);
            allPrice.push_back(tmp);
        }
        allPrice[0][0] = board[0][0];
        for (int i = 0; i < length; ++i) {
            for (int j = 0; j < wideth; ++j) {
                //        ,      
                if (i == 0 && j == 0)
                    continue;
                //          ,      ,        ,                  
                else if (i == 0) 
                    allPrice[i][j] = allPrice[i][j - 1] + board[i][j];
                //          ,      ,        ,                  
                else if (j == 0)
                    allPrice[i][j] = allPrice[i - 1][j] + board[i][j];
                else
                    //       、  ,              ,                              
                    allPrice[i][j] = max(allPrice[i][j - 1], allPrice[i - 1][j]) + board[i][j];
            }
        }
        //     ,           ,                 
        return allPrice[length - 1][wideth - 1];
    }
};

좋은 웹페이지 즐겨찾기