问题描述
知识点
套了一层外壳的LIS
实现
码前思考
- 主要是思考测试的输入和输出是怎么来的,结果发现是LIS
实现代码
//通过分析输入和输出的案例,我们发现这是一个求LDS的题目!!!
//机试很少给你裸的题目,大多是套一层实际情况的外壳
#include "bits/stdc++.h"
using namespace std;
const int maxn = 30;
//输入的数据的数量
int n;
//输入的序列
int seq[maxn];
//dp数组:以第i个结尾的DS的长度
int dp[maxn];
int main(){
while(~scanf("%d",&n)){
//读入输入数据
int input;
for(int i=1;i<=n;i++){
scanf("%d",&input);
seq[i] = input;
}
//进行dp求解
int ans = 1;
//递推边界
dp[1] = 1;
//开始递推
for(int i=2;i<=n;i++){
//初始化dp【i】为1
dp[i] = 1;
for(int j=1;j<i;j++){
if(seq[i] <= seq[j] && dp[i] < dp[j]+1){
dp[i] = dp[j] + 1;
}
}
ans = max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}
码后反思
- 通过上面的题目发现,LIS绝不仅仅只是用来解决单纯的最长递增子序列的问题,也可以通过类比来求解其他大小关系确定的子序列的最长长度。(也就是说,只要存在优先级关系,然后要求最长,都可以使用LIS!!!)