最长上升子序列模型 闫氏dp法

最长上升子序列基础题模型 链接 :最长上升子序列模板题
最长上升子序列基础题题解 链接 : 最长上升子序列模板题 题解

本题的思路很简单 题目所说的 怪盗基德可以从任一位置开始 也就是 题目所给的顺序并不是严格顺序 可以倒序进行
说到这里了 大家都知道了 可以进行两次取最长上升子序列 求两次的最大值就好了 是不是很简单
不知道怎么求最长上升子序列的同学可以移步上面的链接 基础题解
Code:
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #define int long long
  5. using namespace std;
  6. int t;
  7. int a[110] , f[110];
  8. signed main()
  9. {
  10. ios::sync_with_stdio(false); //取消输入输出流
  11. cin >> t;
  12. int ans ; // 记录答案;;
  13. while (t --)
  14. {
  15. int n;
  16. cin >> n;
  17. ans = 0; // 每次都要归零 不然会影响一下组 测试点
  18. for (int i = 1 ; i <= n ; i ++ ) cin >> a[i] ;
  19. for (int i = 1 ; i <= n ; i ++ ) //正向最长上升子序列
  20. {
  21. f[i] = 1; //每个f[i] 都是一个楼 也是最低的答案 1
  22. for (int j = 1 ; j < i ; j ++ )
  23. if (a[i] > a[j]) f[i] = max(f[i] , f[j] + 1);
  24. ans = max(ans , f[i]); //更新答案
  25. }
  26. for (int i = n ; i >= 1 ; i -- ) //反向最长上升子序列
  27. {
  28. f[i] = 1; //这里也需要初始值为1
  29. for (int j = n ; j > i ; j -- )
  30. if (a[i] > a[j]) f[i] = max(f[i] , f[j] + 1);
  31. ans = max(ans , f[i]); //更新答案
  32. }
  33. cout << ans << endl;
  34. }
  35. return 0;
  36. }
点赞(0)
 

9.9 分

2 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

109徐守佳 7月前 回复TA
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⠀⣼⣿⣿⣦⡀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⢸⣿⣿⡟⢰⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠿⢿⣦⣀⠀⠘⠛⠛⠃⠸⠿⠟⣫⣴⣶⣾⡆⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⡀⠀⠉⢿⣦⡀⠀⠀⠀⠀⠀⠀⠛⠿⠿⣿⠃⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⠀⠀⠹⣿⣶⡾⠛⠛⢷⣦⣄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣧⠀⠀⠈⠉⣀⡀⠀⠀⠙⢿⡇⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⡿⠟⠋⠀⠀⢠⣾⠟⠃⠀⠀⠀⢸⣿⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣠⣶⡿⠛⠉⠀⠀⠀⠀⠀⣾⡇⠀⠀⠀⠀⠀⢸⣿⠇⠀⠀⠀⠀⠀
⠀⢀⣠⣾⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⢀⣼⣧⣀⠀⠀⠀⢀⣼⠇⠀⠀⠀⠀⠀⠀
⠀⠈⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡿⠋⠙⠛⠛⠛⠛⠛⠁⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢾⠿⠋⠀