← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	grid := make([][]int, 2)
	for i := 0; i < 2; i++ {
		grid[i] = make([]int, n)
		for j := 0; j < n; j++ {
			fmt.Fscan(reader, &grid[i][j])
		}
	}

	dp1 := make([]int, n+1)
	dp2 := make([]int, n+1)
	L3 := make([]int, n+1)

	last1 := make(map[int]int)
	last2 := make(map[int]int)
	last3 := make(map[int]int)

	last1[0] = 0
	last2[0] = 0
	last3[0] = 0

	pref1 := 0
	pref2 := 0
	pref3 := 0

	L1 := make([]int, n+1)
	L2 := make([]int, n+1)

	for i := 1; i <= n; i++ {
		pref1 += grid[0][i-1]
		if val, ok := last1[pref1]; ok {
			L1[i] = val + 1
		}
		last1[pref1] = i

		pref2 += grid[1][i-1]
		if val, ok := last2[pref2]; ok {
			L2[i] = val + 1
		}
		last2[pref2] = i

		pref3 += grid[0][i-1] + grid[1][i-1]
		if val, ok := last3[pref3]; ok {
			L3[i] = val + 1
		}
		last3[pref3] = i
	}

	for i := 1; i <= n; i++ {
		dp1[i] = dp1[i-1]
		if L1[i] > 0 {
			dp1[i] = max(dp1[i], dp1[L1[i]-1]+1)
		}

		dp2[i] = dp2[i-1]
		if L2[i] > 0 {
			dp2[i] = max(dp2[i], dp2[L2[i]-1]+1)
		}
	}

	dp := make([]int, n+1)
	M := 0

	for i := 1; i <= n; i++ {
		dp[i] = dp[i-1]
		if L3[i] > 0 {
			dp[i] = max(dp[i], dp[L3[i]-1]+1)
		}
		dp[i] = max(dp[i], M+dp1[i]+dp2[i])
		M = max(M, dp[i]-dp1[i]-dp2[i])
	}

	fmt.Println(dp[n])
}
```