最长不下降自序列(最长递增子序列)C++动态规划

你的名字 2022-08-29 15:52 281阅读 0赞

题目:http://www.kencoding.net/problem.php?id=1112

最长递增子序列(Longest Increasing Subsequence , LIS)问题:给定一个长度为N的数组,找出一个最长的单调递增子序列。例如一个长度为7的序列 A = 5 , 6 , 7 , 4 , 2 , 8 , 3 A={5,6,7,4,2,8,3} A=5,6,7,4,2,8,3,它最长的单调递增子序列为 5 , 6 , 7 , 8 {5,6,7,8} 5,6,7,8,长度为4.

在这里插入图片描述

在这里插入图片描述

此题答案,也是最长不下降自序列的固定模板:

  1. #include <cstdio>
  2. int a[1000];
  3. int n;
  4. int f[1000];
  5. int main(){
  6. scanf("%d",&n);
  7. int i;
  8. int j;
  9. for (i=1;i<=n;i++){
  10. scanf("%d",&a[i]);
  11. }
  12. //每个点的f值不可能小于1
  13. for(i=1;i<=n;i++) f[i] =1;
  14. int max = 1;
  15. for (i=2;i<=n;i++){
  16. for(j=1;j<i;j++){
  17. if( a[j] <= a[i] && f[i] < f[j]+1){
  18. f[i] = f[j]+1;
  19. if(max < f[i])
  20. max = f[i];
  21. }
  22. }
  23. }
  24. printf("%d",max);
  25. return 0;
  26. }

下面给出一个例题

导弹拦截系统 hdu 1257

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

在这里插入图片描述

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 100010;
  4. int n, high[MAXN];
  5. int LIS(){
  6. int ans = 1;
  7. int dp[MAXN];
  8. dp[1] = 1;
  9. for (int i = 2; i <= n; i++)
  10. {
  11. int max= 0;
  12. for (int j = 1; j < i; j++)
  13. {
  14. if (dp[j] > max && high[j] < high[i])
  15. max = dp[j];
  16. }
  17. dp[i] = max + 1;
  18. if (dp[i] > ans)
  19. ans = dp[i];
  20. }
  21. return ans;
  22. }
  23. int main(){
  24. while (cin >> n)
  25. {
  26. for (int i = 1; i <= n; i++)
  27. {
  28. cin >> high[i];
  29. }
  30. cout << LIS() << endl;
  31. }
  32. }

发表评论

表情:
评论列表 (有 0 条评论,281人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态规划递增序列

    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,\[3,6,2,7\

    相关 动态规划 递增序列

    方法一:最长公共子序列法 将问题转换成求递增排序的数组与原数组的最长公共子序列。 不知道如何排序?看这里: [七大排序算法总结][Link 1] 不知道什么是最长