第1题 最长上升序列II
有N个数放在一个圆周上,可以从任意一个位置开始按照顺时针方向访问数据一圈,沿途可以挑选一些数,要求这些数是上升的(一个比一个大)。问最多能选多少个数?
输入格式
第一行:1个整数N,范围在1到100
第二行有N个整数,每个数范围在1到1000000
输出格式
最多挑选的个数。
输入/输出例子1
输入:
8
2 9 3 5 6 7 1 5
输出:
6
用c++98咋写??
思路,将这个数组复制一份,首尾相接
然后依次判断是否是上升序列
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int arr[n * 2];
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
arr[i] = arr[i + n] = x;
}
int ma = 0;
int curr = 1;
for (int i = 1; i < n * 2; i++)
{
if (arr[i] > arr[i - 1])
curr += 1;
else
curr = 1;
if (curr > ma) ma = curr;
}
cout << (ma > n ? n : ma);
return 0;
}
这题我会,你要代码吗?
思路枚举每个点,但要注意他是围城一个环,可以用指针,也可以复制数组求解, 但暴力枚举我不太确定会不会超时
int cfun(int*arr, int len,int a,int length) {
int L = length;
for (int i = a; i < len; i++)
{
if (arr[a] < arr[i])
{
L = max(L, cfun(arr, len,i, length+1));
}
}
return L;
}
int main() {
int n;
cin >> n;
int arr[200];
int max_L = 1;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
arr[i] = arr[i + n] = x;
}
for (int i = 0; i < n; i++)
{
max_L = max(max_L, cfun(arr, n+i,i, 1));
}
cout<< max_L;
system("pause");
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: