题解 | #拦截导弹#

拦截导弹

https://www.nowcoder.com/practice/218f3db1f66d465bbf9578625aa90785

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

/*
*
本质:
1、求解最长的递减子列长度(非严格递减,即:可以包含=)
2、Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度(严格递增,即:不包含=)
*/
func solution(arr []int) (int, int) {
	incrementDp := make([]int, len(arr))
	decrementDp := make([]int, len(arr))
	for i := 0; i < len(arr); i++ {
		incrementDp[i] = 1
		decrementDp[i] = 1
	}
	maxIncrement := 0
	maxDecrement := 0
	for i := 1; i < len(arr); i++ {
		for j := 0; j < i; j++ {
			//计算1
			if arr[i] <= arr[j] {
				decrementDp[i] = max(decrementDp[i], decrementDp[j]+1)
			}
			maxDecrement = max(maxDecrement, decrementDp[i])
			//计算2
			if arr[i] > arr[j] {
				incrementDp[i] = max(incrementDp[i], incrementDp[j]+1)
			}
			maxIncrement = max(maxIncrement, incrementDp[i])
		}
	}
	return maxDecrement, maxIncrement
}

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

/*
*
8
389 207 155 300 299 170 158 65
结果
6
2
*/
func main() {
	var count int
	fmt.Scanln(&count)
	arr := make([]int, count)
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	str := scanner.Text()
	strs := strings.Split(str, " ")
	for i, val := range strs {
		ele, _ := strconv.Atoi(val)
		arr[i] = ele
	}
	maxDecrement, maxIncrement := solution(arr)
	fmt.Println(maxDecrement)
	fmt.Println(maxIncrement)
}

全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 11:29
已编辑
斯卡蒂味的鱼汤:知道你不会来数马,就不捞你😂最近数马疯狂扩招,招聘要求挺低的,你能力肯定够,应该就是因为太强了,知道你不会来才不捞你
投递腾讯云智研发等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务