您的位置:首页 > 其它

非 动态规划---LIS

2013-10-19 15:39 253 查看
题目:一个序列有N个数:A[1],A[2],…,A
,求出最长非降子序列的长度。(见动态规划---LIS)

/*
题目:一个序列有N个数:A[1],A[2],…,A
,求出最长非降子序列的长度。
*/
#include <stdio.h>

unsigned max_len( int [] , size_t );
size_t b_point( int [] , size_t );
int max(size_t , size_t );

int main( void )
{

int arr[] = { 4 , 5 , 3 , 3 , 3 , 3 , 6 , 5 , 1 , 2 };

printf("%u\n" , max_len( arr , sizeof arr / sizeof arr[0] ) );

return 0;
}

unsigned max_len( int a[] , size_t n )
{
if ( n <= 1u )
return n ;

size_t m = b_point ( a , n ) ;

return max( m , max_len ( a + m , n - m ) ) ;

}

size_t b_point ( int a[] , size_t n )
{
size_t i ;

for ( i = 1u ; i < n ; i++ )
if ( a[i-1] > a[i])
return i - 0u ;

return i - 0u ;
}

int max( size_t n1 , size_t n2 )
{
if ( n1 > n2 )
return n1;

return n2;
}


/*
题目:一个序列有N个数:A[1],A[2],…,A
,求出最长非降子序列的长度。
*/
#include <stdio.h>

unsigned max_len( int [] , size_t );
size_t b_point( int [] , size_t );

int main( void )
{
int arr[] = { 4 , 5 , 3 , 3 , 3 , 3 , 6 , 5 , 1 , 2 };

printf("%u\n" , max_len( arr , sizeof arr / sizeof arr[0] ) );

return 0;
}

unsigned max_len( int a[] , size_t n )
{
size_t len = 0u ;
while ( n > 0u )
{
size_t mid = b_point( a , n );

if ( mid > len )
len = mid ;

a += mid ;
n -= mid ;
}
return len ;
}

size_t b_point ( int a[] , size_t n )
{
size_t i ;

for ( i = 1u ; i < n ; i++ )
if ( a[i-1] > a[i])
return i - 0u ;

return i - 0u ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: