← Home
```go
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var t int
	fmt.Fscan(reader, &t)
	for ; t > 0; t-- {
		var n int
		fmt.Fscan(reader, &n)
		segs := make([][2]int, n)
		coords := make([]int, 0, 2*n)
		for i := 0; i < n; i++ {
			var l, r int
			fmt.Fscan(reader, &l, &r)
			segs[i] = [2]int{l, r}
			coords = append(coords, l, r)
		}
		sort.Ints(coords)
		m := 0
		for i := range coords {
			if i == 0 || coords[i] != coords[i-1] {
				coords[m] = coords[i]
				m++
			}
		}
		coords = coords[:m]
		mp := make(map[int]int, m)
		for i, v := range coords {
			mp[v] = i
		}
		segAtR := make([][]int, m)
		for _, seg := range segs {
			li, ri := mp[seg[0]], mp[seg[1]]
			segAtR[ri] = append(segAtR[ri], li)
		}

		dp := make([][]int32, m)
		for i := range dp {
			dp[i] = make([]int32, m)
		}

		for r := 0; r < m; r++ {
			for l := r; l >= 0; l-- {
				if l < r {
					dp[l][r] = dp[l][r-1]
				}
				for _, li := range segAtR[r] {
					if li >= l {
						var val int32 = 1
						if li < r-1 {
							val += dp[li+1][r-1]
						}
						if li > l {
							val += dp[l][li-1]
						}
						if val > dp[l][r] {
							dp[l][r] = val
						}
					}
				}
			}
		}
		fmt.Fprintln(writer, dp[0][m-1])
	}
}
```