BZOJ-1978: [BeiJing2010]取数游戏 game(DP)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1978

由于要搞最大公约数,那么就直接sqrt(a[i])枚举约数即可,然后开一个桶来优化一下,复杂度就成了O( n sqrt( a ) )

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
 
using namespace std ;
 
#define maxa 1001000
#define maxn 50010
#define rep( i , x ) for ( int i = 0 ; i ++ < x ; )
 
int Max[ maxa ] , f[ maxn ] , n , a[ maxn ] , ans = 0 ;
int b[ maxn ] , bn , l ;
 
int main(  ) {
    memset( Max , 0 , sizeof( Max ) ) ;
    memset( f , 0 , sizeof( f ) ) ;
    scanf( "%d%d" , &n , &l ) ;
    rep( i , n ) scanf( "%d" , a + i ) ;
    rep( i , n ) {
        bn = 0 ;
        int len = int( sqrt( a[ i ] ) ) ;
        rep( j , len ) if ( ! ( a[ i ] % j ) ) {
            b[ ++ bn ] = j ; 
            if ( a[ i ] / j != j ) b[ ++ bn ] = a[ i ] / j ;
        }
        rep( j , bn ) if ( b[ j ] >= l ) f[ i ] = max( f[ i ] , Max[ b[ j ] ] ) ;
        ans = max( ans , ++ f[ i ] ) ;
        rep( j , bn ) Max[ b[ j ] ] = max( Max[ b[ j ] ] , f[ i ] ) ;
    }
    printf( "%d\n" , ans ) ;
    return 0 ; 
}
    原文作者:AmadeusChan
    原文地址: https://www.jianshu.com/p/e824f0974f74
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞