N개의 점을 빨강 또는 파랑으로 칠한 뒤 같은 색 점끼리 교차하지 않게 선분을 그리되 빨강과 파랑 선분은 서로 닿지 않게 그려 점수 합의 최댓값을 구한다.
어려움8동적 계획법기하백트래킹조합론아직 제출이 없습니다시간 제한2초메모리 제한512 MB평면 위에 서로 다른 점 N개가 있다. 점에는 0번부터 N−1번까지 번호가 붙어 있다.
점과 점을 잇는 선분을 그어 점수를 모으는 게임을 한다. 게임은 두 단계로 진행한다. 첫 번째 단계에서는 모든 점을 빨간색이나 파란색으로 칠한다. 두 번째 단계에서는 선분을 0개 이상 긋는다.
선분은 색이 같은 두 점을 이어서 긋고, 선분의 색은 두 점의 색과 같다.
색이 같은 선분끼리는 닿거나 교차해도 된다. 색이 다른 선분끼리는 닿거나 교차하면 안 된다. 즉 빨간 선분과 파란 선분은 공통점이 하나도 없어야 하고, 한 선분의 끝점이 다른 색 선분 위에 놓이는 것도 안 된다.
이 제한은 실제로 그은 선분 사이에만 적용한다. 빨간 선분이 파란 점을 지나가더라도 그 점에 닿는 파란 선분을 긋지 않았다면 상관없다.
i번 점과 j번 점을 잇는 빨간 선분의 점수는 red[i][j]이고, 같은 두 점을 잇는 파란 선분의 점수는 blue[i][j]이다.
선분을 그어서 얻을 수 있는 점수의 최댓값을 구하는 프로그램을 작성하시오.
첫째 줄에 점의 개수 N이 주어진다. (2≤N≤20)
둘째 줄부터 N개의 줄에 걸쳐 0번 점부터 차례대로 점의 좌표 x와 y가 주어진다. (−1000≤x,y≤1000) 좌표가 같은 점은 없다.
이어지는 N개의 줄에는 빨간 선분의 점수 행렬이 주어진다. 그중 i번째 줄의 j번째 수가 red[i][j]이다. 그다음 N개의 줄에는 같은 방식으로 파란 선분의 점수 행렬 blue[i][j]가 주어진다. red[i][j]와 blue[i][j]는 모두 0 이상 100,000 이하의 정수이다.
모든 i에 대해 red[i][i]와 blue[i][i]는 0이고, 모든 i와 j에 대해 red[i][j]는 red[j][i]와 같고 blue[i][j]는 blue[j][i]와 같다.
첫째 줄에 선분을 그어서 얻을 수 있는 점수의 최댓값을 출력한다.
첫 번째 예제에서는 점을 모두 파란색으로 칠하고 파란 선분을 여섯 개 모두 그으면 2+3+7+4+6+5=27점이 된다.