블루 브리지 컵 알고리즘 트레이닝 체크 수 By Assassin [다중 스레드 dp]

     
    N*N    (N<=10),                ,            0。
           A  (1,1)  ,      ,      ,        B (N,N)。      ,          (            0)。
     A  B      ,   2      ,           。
    
             N(  N*N    ),           ,       ,             。     0      。
    
          ,  2           。
    
  8
  2 3 13
  2 6 6
  3 5 7
  4 4 14
  5 2 21
  5 6 4
  6 3 15
  7 2 14
  0 0 0
    
  67

문제풀이: 문제가 명확하다. (1,1)부터 (n,n)까지 그리고 아래로 오른쪽으로만 갈 수 있다. 만약에 두 사람이 한 걸음 한 걸음 걸으면 두 사람이 동시에 어느 점(x,y)에 도착하지 않을 수 없다. 예를 들어 두 사람이 (1,1)에서 (2,2)에 도착하면 반드시 동시적이어야 한다. 이렇게 하면 다선정 dp의 타당성을 보장한다.
코드를 직접 보세요!
#include
using namespace std;
int dp[11][11][11][11]={0};
int mapp[11][11]={0};
int n;
int dp_go(int x1,int y1,int x2,int y2){
    if(x1==x2&&y1==y2){
        return mapp[x1][y1];
    }
    else{
        return mapp[x1][y1]+mapp[x2][y2];
    }
}


int main(){
    int temp1,temp2,pos;
    scanf("%d",&n);
    while(1){
        scanf("%d%d%d",&temp1,&temp2,&pos);
        if(temp1==0&&temp2==0&&pos==0) break;
        mapp[temp1][temp2]=pos;
    }
    for(int x1=1;x1<=n;x1++){
        for(int y1=1;y1<=n;y1++){
            for(int x2=1;x2<=n;x2++){
                for(int y2=1;y2<=n;y2++){
                    dp[x1][y1][x2][y2] = max(max(dp[x1-1][y1][x2-1][y2], dp[x1-1][y1][x2][y2-1]),
                                             max(dp[x1][y1-1][x2-1][y2],dp[x1][y1-1][x2][y2-1]));
                    dp[x1][y1][x2][y2]+=dp_go(x1,y1,x2,y2); 
                }
            }
        }
    }
    cout<return 0;
} 

좋은 웹페이지 즐겨찾기