poj2533解题报告

题目描述请见:

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 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值