动态规划2:最长不下降子序列--连续序列+不连续序列

梦里梦外; 2023-07-09 02:01 110阅读 0赞
  1. //最长不下降子序列--连续+不连续
  2. #include <cstdio>
  3. #include "vector"
  4. #include "algorithm"
  5. using namespace std;
  6. const int maxn = 10010;
  7. int A[maxn], dp[maxn];//A存放数字序列  dp存放以A[i]结尾的连续序列长度
  8. vector<int> ans[maxn];//ans存放最长子序列
  9. int dp2[maxn];
  10. void LIS1(int n) {
  11. //不连续最长子序列
  12. int maxdp = 0, maxdpLoc = 0;//记录最长子序列 子序列下标
  13. for (int i = 0; i < n; i++) {
  14. dp[i] = 1;
  15. ans[i].push_back(1);
  16. for (int j = 0; j < i; j++) {
  17. if (A[j] <= A[i] && dp[j] + 1 > dp[i]) {
  18. dp[i] = dp[j] + 1;
  19. ans[j].push_back(A[i]);
  20. if (maxdp < ans[j].size()) {
  21. maxdpLoc = j;
  22. maxdp = ans[j].size();
  23. }
  24. }
  25. }
  26. }
  27. printf("len: %d\n", maxdp);
  28. for (int i = 0; i < maxdp; i++)
  29. printf("%d ", ans[maxdpLoc][i]);
  30. printf("\n");
  31. }
  32. void LIS2(int n) {
  33. //不连续最长子序列
  34. int maxdp = 0, maxdpLoc = 0;//记录最长子序列 子序列下标
  35. dp2[0] = 1;
  36. for (int i = 1; i < n; i++) {
  37. if (A[i] >= A[i - 1]) {
  38. dp2[i] = dp2[i - 1] + 1;
  39. if (maxdp < dp2[i]) {
  40. maxdp = dp2[i];
  41. maxdpLoc = i;
  42. }
  43. }
  44. }
  45. printf("len: %d\n", maxdp);
  46. for (int i = 0; i < maxdp; i++)
  47. printf("%d ", A[maxdpLoc - maxdp + i + 1]);
  48. printf("\n");
  49. }
  50. int main() {
  51. int n;
  52. scanf("%d", &n);
  53. for (int i = 0; i < n; i++) {
  54. scanf("%d", &A[i]);
  55. }
  56. LIS1(n);
  57. LIS2(n);
  58. }
  59. /* 8 1 2 3 -9 3 9 0 11 */

测试结果:
在这里插入图片描述

发表评论

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

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

相关阅读

    相关 连续重复序列

    最长连续不重复子序列 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数

    相关 连续重复序列

    题目描述 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数(均在 0∼1

    相关 799. 连续重复序列

    给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数(均在 0∼105 范围内)