最长递增子序列(Longest Increasing Subsequence, LIS)。我们需要找到一个最长的递增子序列,同时满足游玩顺序从远到近的条件。
#include <stdio.h>
int main() {
int n = 10; // 娱乐设施的数量
int queue[10] = {10, 31, 22, 57, 38, 66, 79, 101, 83, 120}; // 排队人数
int dp[10]; // dp[i] 表示以第i个元素结尾的最长递增子序列的长度
// 初始化dp数组,每个元素至少可以构成一个长度为1的子序列
for (int i = 0; i < n; i++) {
dp[i] = 1;
}
// 动态规划求解最长递增子序列
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (queue[i] > queue[j]) {
dp[i] = (dp[i] > dp[j] + 1) ? dp[i] : dp[j] + 1;
}
}
}
// 找到dp数组中的最大值,即为最长递增子序列的长度
int max_len = 0;
for (int i = 0; i < n; i++) {
if (dp[i] > max_len) {
max_len = dp[i];
}
}
// 输出结果
printf("%d\n", max_len);
return 0;
}