URAL 1079. Maximum

problem url:  http://acm.timus.ru/problem.aspx?space=1&num=1079

this should be a mathematics question. So far I got two answers. MY own is using static array to cache all the sequence elements while there is another mathematic way which dosn't require Array or cache(of each sequence element):

#simple approach(not good at scalability):

#include  < cstdio >
#include 
< iostream >


#define  MAXNUM 100000

using   namespace  std;

// GLOBAL VARIABLES
int  NUMS[MAXNUM / 2 + 2 ];  // each item of the sequence

int  curmax  =   0 ;

int  inputs[ 10 ];
int  maxs[ 10 ];
int  inputcnt  =   0 ;
int  maxinput  =   0 ;

void  main()
{
    
int i =0,j=0;
    
int curinput=0;    

    
do
    
{
        scanf(
"%d"&curinput);
        inputs[inputcnt
++= curinput;

        
if(curinput > maxinput) maxinput = curinput;

    }
while(curinput != 0);

    curmax 
=0;
    
int curitem = 0;

    
for(i=0;i<= maxinput;++i)
    
{
        
if(i==0) curitem = 0;
        
else if(i == 1) curitem = 1;
        
else
        
{
            
if(i%2)
            
{
                curitem 
= NUMS[i/2+ NUMS[i/2 +1];
            }
else
            
{
                curitem 
= NUMS[i/2];
            }

        }


        
if(curmax < curitem) curmax = curitem;

        
if(i<(MAXNUM/2+2)) NUMS[i] = curitem;

        
for(j=0;j<inputcnt-1;++j)
        
{
            
if(inputs[j] == i) maxs[j] = curmax;
        }

    
    }

    
    
for(i=0;i<inputcnt-1;++i)  printf("%d ", maxs[i]);
}



#pure mathematics approach(can not understand yet :( ):

/*

Assume g(n,i,j)=i*f(n)+j*f(n+1).
Then
g(2n,i,j)=g(n,i+j,j)
g(2n+1,i,j)=g(n,i,i+j)
We must find f(n)=g(n,1,0), so... 

*/


#include 
< iostream >
int     n,x;
int     a[ 10 ];m
int     i,t;

int     _max( int  s1, int     s2, int  x)
{
    
if  (x == n)
        
return  s1 + s2;
    
else  {
        
int     t1,t2;
        
if  (x * 2 - 1 <= n)
            t1 
=  _max(s1,s2 + s1,x * 2 - 1 );
        
else
            t1 
=   0 ;
        
if  (x * 2 + 1 <= n)
            t2 
=  _max(s1 + s2,s2,x * 2 + 1 );
        
else
            t2 
=   0 ;
        
if  ((t1 == t2) && (t2 == 0 ))
            
return  s1 + s2;
        
else
            
return  t1 > t2 ? t1:t2;
    }
}

int     main()
{
    std::cin 
>>     n;
    i 
=      0 ;
    
while  (n){
        
if  (n == 2 )
            a[i] 
=   1 ;
        
else  
            
if  (n == 1 )
                a[i] 
=   1 ;
            
else
                
if  (n == 0 )
                    a[i] 
=   0 ;
                
else
                    a[i] 
=  _max( 1 , 1 , 3 );
        std::cin 
>>     n;
        i
++ ;
    }
    
for     (n  =   0 ;n < i;n ++ )
        std::cout 
<<  a[n]  <<   " " ;

    
return   0 ;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值