For problem statement at 1000-1999/1600-1699/1660-1669/1666/problemJ.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1660-1669/1666/verifierJ.go ends with Input:
25
0 792 787 263 703 630 237 716 835 700 52 565 596 113 570 404 454 625 4 748 850 48 955 618 626
792 0 938 603 134 840 868 651 191 341 26 556 285 301 881 324 701 283 297 863 664 59 273 560 504
787 938 0 931 934 935 576 34 962 808 170 5 543 244 4 711 526 737 173 491 384 512 151 772 790
263 603 931 0 793 865 857 155 575 643 583 471 999 344 698 227 314 168 737 46 593 352 132 749 123
703 134 934 793 0 834 619 455 31 110 91 330 854 2 322 156 396 245 400 57 607 444 366 862 714
630 840 935 865 834 0 151 743 103 44 33 541 782 170 171 120 889 99 17 811 808 99 694 27 908
237 868 576 857 619 151 0 606 490 515 523 836 704 608 481 389 650 475 864 897 383 700 647 691 661
716 651 34 155 455 743 606 0 451 28 206 812 934 527 688 58 986 676 680 26 158 100 734 448 480
835 191 962 575 31 103 490 451 0 5 279 400 306 765 922 597 567 774 21 825 68 54 721 897 434
700 341 808 643 110 44 515 28 5 0 247 628 250 149 479 477 981 256 555 881 980 750 937 877 371
52 26 170 583 91 33 523 206 279 247 0 380 278 196 563 186 654 513 182 757 766 101 671 609 701
565 556 5 471 330 541 836 812 400 628 380 0 698 337 755 852 104 892 523 21 563 721 70 712 117
596 285 543 999 854 782 704 934 306 250 278 698 0 123 156 438 479 124 394 694 87 803 636 326 161
113 301 244 344 2 170 608 527 765 149 196 337 123 0 995 762 967 933 252 637 965 397 543 384 131
570 881 4 698 322 171 481 688 922 479 563 755 156 995 0 967 666 163 845 100 684 655 578 390 658
404 324 711 227 156 120 389 58 597 477 186 852 438 762 967 0 541 976 526 215 182 457 134 386 767
454 701 526 314 396 889 650 986 567 981 654 104 479 967 666 541 0 514 121 591 953 157 374 405 125
625 283 737 168 245 99 475 676 774 256 513 892 124 933 163 976 514 0 591 632 362 366 993 374 75
4 297 173 737 400 17 864 680 21 555 182 523 394 252 845 526 121 591 0 646 860 989 877 785 608
748 863 491 46 57 811 897 26 825 881 757 21 694 637 100 215 591 632 646 0 655 45 684 823 280
850 664 384 593 607 808 383 158 68 980 766 563 87 965 684 182 953 362 860 655 0 74 833 922 456
48 59 512 352 444 99 700 100 54 750 101 721 803 397 655 457 157 366 989 45 74 0 431 252 998
955 273 151 132 366 694 647 734 721 937 671 70 636 543 578 134 374 993 877 684 833 431 0 649 477
618 560 772 749 862 27 691 448 897 877 609 712 326 384 390 386 405 374 785 823 922 252 649 0 309
626 504 790 123 714 908 661 480 434 371 701 117 161 131 658 767 125 75 608 280 456 998 477 309 0
Reference Output:
2 25 4 7 6 4 2 10 8 13 12 10 17 15 13 15 7 19 21 19 17 23 21 23 0
Candidate Output:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
cost mismatch: expected 603068 got 1272696 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
n, _ := strconv.Atoi(scanner.Text())
c := make([][]int64, n+2)
for i := range c {
c[i] = make([]int64, n+2)
}
for i := 1; i <= n; i++ {
scanner.Scan()
parts := strings.Fields(scanner.Text())
for j := 1; j <= n; j++ {
val, _ := strconv.ParseInt(parts[j-1], 10, 64)
c[i][j] = val
}
}
row_sum := make([][]int64, n+2)
col_sum := make([][]int64, n+2)
P := make([][]int64, n+2)
for i := 0; i <= n+1; i++ {
row_sum[i] = make([]int64, n+2)
col_sum[i] = make([]int64, n+2)
P[i] = make([]int64, n+2)
}
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
row_sum[i][j] = row_sum[i][j-1] + c[i][j]
}
}
for j := 1; j <= n; j++ {
for i := 1; i <= n; i++ {
col_sum[i][j] = col_sum[i-1][j] + c[i][j]
}
}
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
P[i][j] = P[i-1][j] + P[i][j-1] - P[i-1][j-1] + c[i][j]
}
}
const INF int64 = 1 << 60
dp := make([][]int64, n+2)
root := make([][]int, n+2)
for i := range dp {
dp[i] = make([]int64, n+2)
root[i] = make([]int, n+2)
for j := range dp[i] {
dp[i][j] = INF
}
}
for i := 1; i <= n; i++ {
dp[i][i] = 0
dp[i][i-1] = 0
root[i][i] = i
}
for length := 2; length <= n; length++ {
for l := 1; l <= n-length+1; l++ {
r := l + length - 1
for k := l; k <= r; k++ {
left_cost := dp[l][k-1]
right_cost := dp[k+1][r]
var sum_left_to_k int64 = 0
if k > l {
sum_left_to_k = col_sum[k-1][k] - col_sum[l-1][k]
}
var sum_right_to_k int64 = 0
if k < r {
sum_right_to_k = row_sum[k][r] - row_sum[k][k]
}
var rect_sum int64 = 0
if k > l && k < r {
rect_sum = P[k-1][r] - P[l-1][r] - P[k-1][k] + P[l-1][k]
}
total := left_cost + right_cost + sum_left_to_k + sum_right_to_k + 2*rect_sum
if total < dp[l][r] {
dp[l][r] = total
root[l][r] = k
}
}
}
}
parent := make([]int, n+1)
var build func(l, r, p int)
build = func(l, r, p int) {
if l > r {
return
}
k := root[l][r]
parent[k] = p
build(l, k-1, k)
build(k+1, r, k)
}
build(1, n, 0)
out := make([]string, n)
for i := 1; i <= n; i++ {
out[i-1] = strconv.Itoa(parent[i])
}
fmt.Println(strings.Join(out, " "))
}