全部评论
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scanner.nextInt(); } int tmpArr[] = new int[n]; tmpArr[0] = 1; for (int i = 1; i < n; i++) { if (arr[i] > arr[i - 1]) { tmpArr[i] = tmpArr[i - 1] + 1; }else{ tmpArr[i] = 1; } } int ans = Integer.MIN_VALUE; for (int i = 1; i < n - 1; i++) { if(arr[i + 1] > arr[i -1]){ int start = tmpArr[i -1] + 1; for(int j = i + 1; j < n - 1 && tmpArr[j + 1] > tmpArr[j] ; j++){ start++; } ans = Math.max(ans, start); } } System.out.println(ans); } AC了
我的做法:从左到右遍历得到数组中当前每个数的上升个数。比如:2 1 3 2 5 就是1 1 2 1 2, 然后从右到左遍历,2 1 3 2 5得到的就是1 2 1 2 1。 最后max(res, left[i]+right[i+2])得到答案。 伪代码: for 1 -> n-1 if nums[i] > nums[i-1] left[i] = left[i-1]+1 for n-2 -> 0 if nums[i] < nums[i+1] right[i] = right[i+1]+1 for 0 -> n-3 res = max(res, left[i] + right[i+2])
[图片]
能麻烦发一些这道题的题目吗?
我发现每次情况删一个数dp一次的话最后只能AC百分之四十多,其他情况超时。然后改了一下,只整体dp一次,然后找到最大数+1能AC百分之七十六😁
遇到一个逆序的可以无视(因为题目可以删除一个),指针顺势往下移比较大小,不逆序就记录长度更新到结果,逆序就退出这个逆序情况有i和i+2比还有i-1和i+1的两种情况,只做一种只过64,花了好长时间想到另一种把这题a了,我个人是这么个情况
Dp
我的做法是这样的,如果检测到一个数,他比两边都大,或者比两边都小(极值,破坏单调的数),就以他为中心向两边搜索两边单调递增递减的区间,加起来。。。
相关推荐
点赞 评论 收藏
分享