luogu1006:쪽지:검사기DP

제목 연결

  • 이 문제는 루고 시련장의 2-17:T2
  • 제목의 대의.

  • n*m의 바둑판은 칸마다 0-100의 수치가 있다.
  • 왼쪽 상단에서 출발하여 오른쪽과 아래로 내려가 오른쪽 하단에 도달할 수 있다.
  • 오른쪽 아래에서 출발하여 왼쪽과 위로 올라가 왼쪽 상단에 도달할 수 있다.
  • 2차례의 노선이 중복되지 않도록 하고 칸을 통과한 수치와 가능한 한 크도록 요구한다.

  • 제목 분석

  • 체면이 매우 직관적이어서 첫 번째 느낌은 깊이 검색하면 할 수 있고 50의 데이터만 있어서 아무렇게나 하면 AC를 폭력적으로 할 수 있을 것 같다.
  • 본 문제는 DP 모듈이기 때문에 DP의 사고방식으로 분석한다.
  • 사실 왼쪽 상단에서 오른쪽 하단으로 두 번 가다가 노선이 다르면 오른쪽과 아래 두 방향만 있기 때문에 상태의 추측이 많이 줄어든 것으로 볼 수 있다.
  • 두 번 가야 하는데 이것은 바로 얽힌 문제이다. 노선이 중복될 수 없기 때문에 매번 두 칸을 걷는 것으로 이해할 수 있다. (x1, y1), (x2, y2).

  • 아이디어 1: 4차원 DP

  • DP의 문제풀이 세트, 무엇을 설정하느냐고 묻는다:
  • f[x1][y1][x2][y2]는 동시에 (x1, y1)와 (x2, y2)에 발을 들여놓는 것이 가장 좋은 것을 나타낸다.
  • 전이 방정식은 다음과 같은 네 가지 상황을 고려해야 한다. 1) 모두 가로에서 온다.2) 모두 세로로 한다.3) 1 가로로 하고 2 세로로 한다.4) 1은 세로로, 2는 가로로 한다.
  • 그래서: f[x1][y1][x2]=max(f[x1][y1-1][x2][y2-1], f[x1-1][y1][x2-1][y2], f[x1][y1-1][x2-1][y2][y2], f[x1-1][y1][y1][x2][y2][x2][x2][y2]]][y2-1])+a[y1][y2];
  • (x1, y1)와 (x2, y2)는 중첩할 수 없기 때문에 매거할 때 판단을 한다.
  • 마지막 답은 f[n][m-1][n-1][m]일 것이다.

  • 아이디어 1 참조 코드
    //luogu1006:   :  DP 
     
    #include
    using namespace std;
    
    int f[60][60][60][60];
    int a[60][60];
    int n,m;
    int maxx(int x,int y,int j,int k)// 4        
    {
    	if(x

    아이디어 2: 3D DP로 최적화

  • 기본적인 사고방식과 4차원 DP의 변화는 없지만 간단한 관찰 분석을 할 수 있다. (x1, y1)과 (x2, y2)는 왼쪽 상단에서 출발하고 동시에 진행하기 때문에 같은 오른쪽 비스듬한 곳에 떨어진 것이 틀림없다
  • .
  • 그래서 다음과 같다. (x1+y1)은 (x2+y2)
  • 와 같다.
  • 따라서 원래 4층의 순환은 3층으로 변할 수 있다. i는 현재 i사임을 나타내고 x1과 x2를 각각 매거하면 대응하는 좌표를 직접 계산할 수 있다.
  • 이렇게 하면 데이터가 1000까지 증가하는 테스트 포인트에 적용할 수 있다.

  • 아이디어 2 참조 코드:
    //luogu1006:   :  DP 
    #include
    using namespace std;
    
    int f[200][60][60];
    int a[60][60];
    int n,m;
    int maxx(int x,int y,int j,int k)// 4        
    {
    	if(x

    좋은 웹페이지 즐겨찾기