代码改变世界

最长合法序列

2006-11-05 17:59  老博客哈  阅读(601)  评论(2编辑  收藏  举报
/*
http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10179
*/

#include 
<iostream>

using namespace std;

int GetMax(int B[], int len)
{
    
int max = B[0];
    
for(int i = 1; i < len; i++)
    
{
        
if(B[i] > max)
            max 
= B[i];
    }

    
return max;
}


int main()
{
    
int n;
    
long long A[1001];
    
int len;
    
int i, j;
    cin 
>> n;
    
while(n--)
    
{
        cin 
>> len;
        
int B[1001= {0};
        
for(i = 0; i < len; i++)
            cin 
>> A[i];
        
for(i = 1; i < len; i++)
        
{
            
for(j = i - 1; j >= 0; j--)
            
{
                
if(A[i] >= A[j])
                
{
                    
if(B[i] <= B[j])
                    
{
                        B[i] 
= B[j] + 1;
                    }

                }

            }

        }

        cout 
<< GetMax(B, len) + 1<< endl;
    }


    
return 0;
}
经典dp问题,记B[i]为以当前数字作为结尾的最长序列的长度,
则 B[i] = max{B[0..i-1]}  + 1 前提是A[i]的数字要比该位上的数大。