Разбор
Реализуем рекурсивную функцию с запоминанием результатов.
Реализация алгоритма
Объявим двумерный массив для запоминания значений функции: .
long long dp[51][51];
Реализация рекурсивной функции с запоминанием.
long long f(int x, int y) { if (x <= 0 || y <= 0) return 0; if (dp[x][y] != -1) return dp[x][y]; if (x <= y) return dp[x][y] = f(x-1,y-2) + f(x-2,y-1) + 2; return dp[x][y] = f(x-2,y-2) + 1; }
Основная часть программы. Читаем входные данные.
scanf("%d %d",&x,&y);
Инициализируем ячейки массива значением .
memset(dp,-1,sizeof(dp));
Вызываем функцию и выводим ее значение.
printf("%lld\n",f(x,y));
Python реализация
Реализация рекурсивной функции с запоминанием.
def f(x, y): if x <= 0 or y <= 0: return 0 if dp[x][y] != -1: return dp[x][y] if x <= y: dp[x][y] = f(x-1, y-2) + f(x-2, y-1) + 2 else: dp[x][y] = f(x-2, y-2) + 1 return dp[x][y]
Основная часть программы. Читаем входные данные.
x, y = map(int, input().split())
Объявим двумерный список для запоминания значений функции: dp[x][y] = f(x, y).
dp = [[-1] * 51 for _ in range(51)]
Вызываем функцию f(x, y) и выводим ее значение.
print(f(x, y))