POJ 2757 最长上升子序列 解题报告

POJ 2757 最长上升子序列 解题报告

编号:2757

 

考查点:动态规划

 

思路:求最优的问题首先要想到用动态规划,想到用动态规划要想到如何找状态转移,这道题肯定是DP,状态转移我倒是想了半天,好不容易搞定了递归+状态量部分,结果忘了从状态量里找到最大的输出了,幸亏及时发现.

 

提交情况: 程序递归部分改了N次,后来提交因为没有从状态量里找最大的输出WA了一次,其它都还好.DP时间和空间效果都还不错.

 

Source Code

 


//POJ Grids 2757
#include <iostream>
using namespace std;

int num[1024];
int len[1024];

int Search(int i)
{
    
if (i==1)
        
return len[1];
    
else
    {
        
int max = 0;
        
for (int j=1;j<i;j++)
        {
            
if (!len[j])
                len[j] 
= Search(j);
            
if (len[j]>max&&num[i]>num[j])
                max 
= len[j];
        }
        len[i] 
= max+1;
    }    
    
return len[i];
}

int main()
{
    
int n;
    cin
>>n;
    
for (int i=1;i<=n;i++)
    {
        cin
>>num[i];
    }
    memset(len,
0,sizeof len);
    len[
1= 1;

    Search(n);
    
int max = 0;
    
for (int i=1;i<=n;i++)
    {
        
if (len[i]>max)
            max 
= len[i];
    }
    cout
<<max<<endl;

    
return 0;
}

总结:DP果真很难,我目前还不能一眼就看出状态转移关系,更不用说其它的了,路漫漫..努力!

 

 

 

                                                       By   Ns517

                                                      Time 09.02.08

posted @ 2009-02-08 22:24  端木  阅读(1520)  评论(0编辑  收藏  举报