地址 https://algospot.com/judge/problem/submit/LIS
给出数组,输出该数组最长的递增子序列
输入:
第一行 样例组数N
下面一行是数组的长度 和一行数组 元素以空格隔开
。。。。一致输出到2N-1行与2N行
输出:
输出每个数组的最长递增子序列的长度 每行输出一个答案
示例
输入
3 4 1 2 3 4 8 5 4 3 2 1 6 7 8 8 5 6 7 8 1 2 3 4
输出
4 4 4
解答
动态规划
dp[i]表示第i个元素的最长递增子序列的长度
dp[i] = max(dp[1],dp[2].....dp[i-1]);
代码
#include <iostream> #include <algorithm> #include <memory.h> #include <vector> using namespace std; /* 3 4 1 2 3 4 8 5 4 3 2 1 6 7 8 8 5 6 7 8 1 2 3 4 输出示例 4 4 4 */ const int N = 510; int arr[N]; int dp[N]; int loop; int len; int main() { cin >> loop; while (loop--) { int ans = 1; memset(arr, 0, sizeof(arr)); for (int i = 0; i < N; i++) dp[i] = 1; cin >> len; for (int i = 0; i < len; i++) { cin >> arr[i]; } for (int i = 1; i < N; i++) { for (int j = i - 1; j >= 0; j--) { if (arr[i] > arr[j]) { dp[i] = max(dp[i],dp[j] + 1); ans = max(ans, dp[i]); } } } cout << ans << endl; } return 0; }