求数组的最长递减子序列
2017-04-27 13:04
645 查看
给定一个整数序列,输出它的最长递减(注意不是“不递增”)子序列。
输入包括两行,第一行包括一个正整数N(N<=1000),表示输入的整数序列的长度。第二行包括用空格分隔开的N个整数,整数范围区间为[-30000,30000]。
输出为一行,最长递减子序列的结果,数字间用空格分隔(测试case中只会有一个最长递减子序列)。
样例输入
8
9 4 3 2 5 4 3 2
样例输出
9 5 4 3 2
经典的dp问题,算法复杂度n^2,难点在打印路径上,使用递归打印比较方便
输入包括两行,第一行包括一个正整数N(N<=1000),表示输入的整数序列的长度。第二行包括用空格分隔开的N个整数,整数范围区间为[-30000,30000]。
输出为一行,最长递减子序列的结果,数字间用空格分隔(测试case中只会有一个最长递减子序列)。
样例输入
8
9 4 3 2 5 4 3 2
样例输出
9 5 4 3 2
经典的dp问题,算法复杂度n^2,难点在打印路径上,使用递归打印比较方便
#include"iostream" #include"vector" #include"string.h" using namespace std; int roud[10010]; int ai[10010]; int mmax=0; void print(int x) { if(x) { print(roud[x]); if(x!=mmax) cout<<ai[x]<<" "; else cout<<ai[x]<<endl; } } int main() { int n; int dp[10010]; memset(dp,0,sizeof(dp)); cin>>n; for(int i=1;i<=n;i++) { cin>>ai[i]; } for(int i=1;i<=n;i++) { dp[i]=1; roud[i]=0; for(int j=1;j<i;j++) { if(ai[i]<ai[j]&&dp[i]<dp[j]+1) { dp[i]=dp[j]+1; roud[i]=j; } } if(dp[i]>dp[mmax]) { mmax=i; } } print(mmax); return 0; }
相关文章推荐
- 算法 - 求一个数组的最长递减子序列(C++)
- coding - 求数组的最长递减子序列
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 计蒜客-求数组的最长递减子序列
- 算法习题47:求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。
- 计蒜客 求数组的最长递减子序列(nlogn+路径打印)
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。
- 计蒜客 难题题库 142 求数组的最长递减子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}
- 算法 - 求一个数组的最长递减子序列(C++)
- 【编程题目】求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}
- 求一个数组的最长递减子序列
- 数据结构——算法之(025)( 求一个数组的最长递减子序列)
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 最大子数组之和、最大子数组之积、最长递增子序列求法