아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

PO 아카이빙

시간 제한1초메모리 제한1024 MB

요약
모든 풀이를 복원할 수 있도록 일부 풀이와 방향성 있는 diff를 저장할 때 필요한 최소 바이트 수를 구한다.
난이도

보통10점 중 7점

유형
그래프, 최소 신장 트리, 그리디, 구현
정답자
아직 제출이 없습니다

문제

프로그래밍 올림피아드는 모든 대회가 끝난 뒤 참가자의 풀이를 영구히 보관한다. 그러나 대회 중 제출되는 풀이 대부분은 상당히 비슷하다. 버그를 고친 참가자는 풀이에서 한 줄만 바꿀 수도 있다. 이런 경우 원래 풀이와 수정된 풀이를 모두 저장하는 것은 불필요하다. 대신 두 풀이 중 하나와 두 풀이 사이에서 이루어진 변경 사항을 저장할 수 있다. 이 과정은 여러 단계로 나누어 진행할 수도 있는데, 풀이 AA를 저장하고, AA와 다른 풀이 BB 사이의 변경 사항을 저장하고, 마지막으로 BB와 세 번째 풀이 CC 사이의 변경 사항을 저장하는 식이다.

대회 중에는 총 NN개의 풀이가 제출되었고, 크기는 각각 S[0],S[1],…,S[N−1]S[0], S[1], \dots, S[N-1]바이트다. ii번째 풀이가 저장되어 있거나 복원 가능하면, 크기가 D[i][j]D[i][j]바이트인 변경 사항이 저장되어 있을 때 jj번째 풀이를 복원할 수 있다.

대부분의 테스트 케이스 그룹에서 diff 크기는 대칭이다. 즉 D[i][j]=D[j][i]D[i][j] = D[j][i]이다(일반적인 Unix diff 파일과 비슷하다). 그러나 마지막 그룹에서는 이것이 성립하지 않을 수 있는 더 일반적인 diff를 다룬다. 예를 들어 문자열 abaabbaaa와 aaaaaa의 차이는 한 방향에서는 "모든 b를 삭제"로 저장되고, 다른 방향에서는 "위치 2, 5, 6에 b를 삽입"으로 저장된다고 생각할 수 있다. 후자의 변경은 전자보다 저장 공간을 더 많이 차지한다.

모든 풀이를 복원할 수 있도록 저장해야 하는 데이터의 최소량(바이트)은 얼마인가?

입력

첫 번째 줄에는 정수 1≤N≤1001 \le N \le 100이 주어진다. 다음 줄에는 NN개의 정수 1≤S[0],S[1],…,S[N−1]≤1 000 0001 \le S[0], S[1], \dots, S[N-1] \le 1\,000\,000이 주어진다. 그다음 NN개의 줄에는 각각 NN개의 정수가 주어진다. 이 줄 중 ii번째 줄에는 수 1≤D[i][0],D[i][1],…,D[i][N−1]≤1 000 0001 \le D[i][0], D[i][1], \dots, D[i][N-1] \le 1\,000\,000이 주어진다. 모든 ii에 대해 D[i][i]=0D[i][i] = 0이다.

출력

저장해야 하는 데이터의 최소량을 바이트 단위로 한 줄에 출력한다.

예제2

  1. 예제 1

    입력
    3
    20 10 30
    0 35 15
    35 0 45
    15 45 0
    
    예상 출력
    45
    
  2. 예제 2

    입력
    3
    100 101 102
    0 5 2
    30 0 1
    40 50 0
    
    예상 출력
    106