← Home
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, " "))
}