简单的DP
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int a[1010];
    int dp[1010];
    int n, max;
    int i1, i2, i3;
    while( cin >> n )
    {
        if( n == 0) 
            break;
        for(  i1 = 0; i1 < n; i1 ++ )
        {
            cin >> a[i1];
            dp[i1] = a[i1];                                    //先将每个数的递增子序列设为其本身
        }

        for(  i2 = 0; i2 < n; i2 ++ )
        {
            max = 0;
            for( i3 = 0 ; i3 < i2 ; i3++)
                if( a[i2] > a[i3] && max < dp[i3])            //如果a[i2]前面没有比它小的数,dp[i2] = a[i2], 如果前面有比它小的数,
                {                                            //那么dp[i2]是在前面比它小的数中, 选出递增子序列最大的数i3 dp[i2]+= dp[i3];
                    max = dp[i3]; 
                    dp[i2]= dp[i3] + a[i2];
                }
        }

        for( i1 = 0, max = 0; i1 < n; i1++)
            if( max < dp[i1] )
                max = dp[i1];
        
        cout << max << endl;

        memset( dp, 0, sizeof(dp));
        memset( a, 0, sizeof(a) );
    }
    return 0;
}
 

 

 

posted on 2012-11-24 20:59  BUG易  阅读(146)  评论(0编辑  收藏  举报