1. 问题描述:
给定一个长度为 n 的数组,如果它不是非降序(非严格单调递增)的,那么就将它的前半部分或后半部分消灭。不断重复这个消灭一半数组的过程,直至数组变为升序为止。请问,得以幸存的数组的最大可能长度是多少?
输入格式
第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含整数 n。第二行包含 n 个整数 a1,a2,…,an,表示给定数组。
输出格式
输出幸存数组的最大可能长度。
数据范围
1 ≤ T ≤ 10,
1 ≤ n ≤ 16,n 保证是 2 的整数次幂。
1 ≤ ai ≤ 100。
输入样例:
3
4
1 2 2 4
8
11 12 1 2 13 14 3 4
4
7 6 5 4
输出样例:
4
2
1
来源:https://www.acwing.com/problem/content/description/3805/
2. 思路分析:
分析题目可以知道最终需要求解出非降序序列的最大长度,所以当发现当前区间[l,r]存在降序排列的时候那么求解去除掉哪一半可以得到非降序序列的最大长度,这里存在两种选择,所以可以使用递归求解去除掉哪一半数组可以得到非降序序列的最大长度,因为数据规模不是特别大所以是可以通过的。
3. 代码如下:
from typing import List
class Solution:
def dfs(self, l: int, r: int, a: List[int]):
# 标记当前区间[l, r]是否是非递减的区间
flag = 1
for i in range(l, r):
if a[i + 1] < a[i]: flag = 0
if flag: return r - l + 1
mid = l + r >> 1
# 递归求解求解去除掉哪一半会获得更长的非降序的序列长度
return max(self.dfs(l, mid, a), self.dfs(mid + 1, r, a))
def process(self):
T = int(input())
for c in range(T):
n = int(input())
a = list(map(int, input().split()))
print(self.dfs(0, n - 1, a))
if __name__ == '__main__':
Solution().process()