题目描述请见:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2533
基本思想:DP
犯过的错误:最开始定义状态dp[i]是从第一个元素到第i个元素为止的最长子序列长度,但这样做无法确定从第一个元素到第i个元素为止的最长子序列中,最大元素的位置,也就无法与后续的元素进行比较。
于是修改状态dp[i]的定义为:以第i个元素为结尾的递增子序列长度,其状态转移方程是
dp[i] = dp[j]+1 (约束条件:0<=i<n, 0<=j<=i, a[j]<a[i], dp[i]<dp[j]+1)
然后在dp数组中,找出长度最长那个子序列。
代码如下:
#
include<iostream>
#include<vector>
using namespace std;
int getLength(vector < int > v)
{
int n = v . size();
vector < int > dp(n , 1 );
for ( int i = 0 ; i < n; i ++ ) {
for ( int j = 0 ; j <= i; j ++ ) {
if (v[j] < v[i] && dp[i] < dp[j] + 1 ) {
dp[i] = dp[j] + 1 ;
}
}
}
return * max_element(dp . begin() , dp . end());
}
int main()
{
int n = 0 ;
while (cin >> n) {
vector < int > v(n , 0 );
for ( int i = 0 ; i < n; i ++ ) {
cin >> v[i];
}
cout << getLength(v) << endl;
}
return 0 ;
}
#include<vector>
using namespace std;
int getLength(vector < int > v)
{
int n = v . size();
vector < int > dp(n , 1 );
for ( int i = 0 ; i < n; i ++ ) {
for ( int j = 0 ; j <= i; j ++ ) {
if (v[j] < v[i] && dp[i] < dp[j] + 1 ) {
dp[i] = dp[j] + 1 ;
}
}
}
return * max_element(dp . begin() , dp . end());
}
int main()
{
int n = 0 ;
while (cin >> n) {
vector < int > v(n , 0 );
for ( int i = 0 ; i < n; i ++ ) {
cin >> v[i];
}
cout << getLength(v) << endl;
}
return 0 ;
}