P1063エネルギーネックレス間隔[DP]

P1063エネルギーのネックレス

 

 

サンプル入力と出力

入力#1
4 
2 3 5 10
出力#1
710

説明/ヒント

グループ最初の質問を向上させるためにNOIP 2006

 

思考

  石のような質問を組み合わせて、その値は、あなたは少し変更してもらいます。

  石二山を組み合わせることができ、それぞれ(I、K)、(K + 1、j)が存在する場合、値はヘッド[I] *尾[K] *尾[J]について得られました。

  その後、同じような石はそれを行うマージ。

 

コード

 

#include   < ビット/ STDC ++。H >
#define   DBG( X  COUT  <<   #X   <<   " = "   <<  X  <<  ENDL
#defineは  epsは  1個の 電子を - 8
#define   パイ  ACOS( - 1.0

使用して  名前空間  はstdを
typedef  long  long LL ;

const  int inf  =  0x 3f3f3f3f ;

template < class T > inline  void  read(& res )
{
     char c ;T flag = 1 ;
     while((c = getchar()) < ' 0 ' ||c > ' 9 ' )if(c == ' - ' )flag =- 1 ;res =c - ' 0 ' ;
     while((c = getchar()) >= ' 0 ' &&c <= ' 9 ' )res =res * 10 +c - ' 0 ' ;res *=flag ;
}

namespace _buff  {
     const  size_t BUFF  =  1  <<  19 ;
     char  ibuf [BUFF ],  *ib  = ibuf ,  *ie  = ibuf ;
     char  getc()  {
         if  (ib  == ie )  {
            ib  = ibuf ;
            ie  = ibuf  +  fread(ibuf ,  1 , BUFF , stdin );
         }
         return ib  == ie  ?  - 1  :  *ib ++ ;
     }
}

int  qread()  {
     using  namespace _buff ;
     int ret  =  0 ;
     bool pos  =  true ;
     char c  =  getc();
     for  (;  (<  ' 0 '  || c  >  ' 9 ' )  && c  !=  ' - ' ; c  =  getc())  {
         assert( ~c );
     }
     if  (==  ' - ' )  {
        pos  =  false ;
        c  =  getc();
     }
     for  (; c  >=  ' 0 '  && c  <=  ' 9 ' ; c  =  getc())  {
        ret  =  (ret  <<  3 )  +  (ret  <<  1 )  +  (^  48 );
     }
     return pos  ? ret  :  -ret ;
}

const  int maxn  =  307 ;

int n ;

int  head [maxn ];
int  tail [maxn ];
int  f [maxn ][maxn ];

int  main()
{
     read(n );
     for  (  int i  =  1 ; i  <= n ;  ++)  {
         read( head [i ]);
         head [+ i ]  =  head [i ];
     }
     for  (  int i  =  1 ; i  <=  2  * n  -  1 ;  ++)  {
         tail [i ]  =  head [+  1 ];
     }
     int ans  =  - 1 ;
     tail [ 2  * n ]  =  head [ 1 ];
     for  (  int z  =  1 ; z  <= n  -  1 ;  ++)  { //!枚举区间长度
         for  (  int i  =  1 ; i  <=  2  * n  - z ;  ++)  {
             int j  = i  + z ;
             for  (  int k  = i ; k  <= j  -  1 ;  ++)  {
                 f [i ][j ]  =  max( f [i ][j ],  f [i ][k ]  +  f [+  1 ][j ]  +  head [i ]  *  tail [k ]  *  tail [j ]);
                ans  =  max(ans ,  f [i ][j ]);
             }
         }
     }
    cout  << ans  << endl ;
     return  0 ;
}

おすすめ

転載: www.cnblogs.com/orangeko/p/12540636.html
おすすめ