最长递减子序列
山东大学机试
目录
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
输入数字n,和n个整数,输出该数字串中的最长递减序列
输入输出格式
输入描述:
见样例
输出描述:
见样例
输入输出样例
输入样例#:
8 9 4 3 2 5 4 3 2
输出样例#:
9 5 4 3 2
解题方法
思路
dp[i]代表以v[i]为结尾的最长递减子序列
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,maxLen;
while(cin>>n) {
maxLen=1;
vector<int> v(n);
vector<int> res;
for(int i=0; i<n; i++) {
cin>>v[i];
v.push_back(v[i]);
}
vector<vector<int>> dp(n);//dp[i]代表以v[i]为结尾的最长递减子序列
for(int i=0; i<n; i++) { //初始化
dp[i].push_back(v[i]);
}
res = dp[0];
for(int i=1; i<n; i++) {
for(int j=0; j<i; j++) {
if(v[i]<v[j]) {
if(dp[i].size()<dp[j].size()+1) {
dp[i] = dp[j];
dp[i].push_back(v[i]);
}
if(dp[i].size()>maxLen) {//更新最大值
maxLen = dp[i].size();
res = dp[i];
}
}
}
}
for(int i=0; i<res.size(); i++) {
cout<<res[i]<<" ";
}
cout<<endl;
}
return 0;
}