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):








































































#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 ;
}
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 ;
}