type none struct{}
func findSubsequencesDP(nums []int) (ans [][]int) {
dp := make([][]int, 0)
set := make(map[string]none)
for _, i := range nums {
for _, a := range dp {
if a[len(a)-1] <= i {
arr := append(a, i)
key := arr2str(arr)
if _, ok := set[key]; !ok {
dp = append(dp, arr)
ans = append(ans, arr)
set[key] = none{}
}
}
}
key := arr2str([]int{i})
if _, ok := set[key]; !ok {
dp = append(dp, []int{i})
set[key] = none{}
}
}
return
}
func arr2str(arr []int) string {
var sb strings.Builder
for _, i := range arr {
sb.WriteString(strconv.Itoa(i))
sb.WriteRune(',')
}
return sb.String()
}
func findSubsequencesDFS(nums []int) (ans [][]int) {
dfs(nums, len(nums), 0, make([]int, 0), &ans)
return
}
func dfs(nums []int, n int, s int, cur []int, ans *[][]int) {
set := make(map[int]bool)
for i := s; i < n; i++ {
if l := len(cur); l != 0 && nums[i] < cur[l-1] {
continue
} else if _, ok := set[nums[i]]; ok {
continue
}
set[nums[i]] = true
nxt := append(cur, nums[i])
if 2 <= len(nxt) {
*ans = append(*ans, nxt)
}
dfs(nums, n, i+1, nxt, ans)
}
}