Реалізуємо рекурсивну функцію з запам'ятовуванням результатів.
Оголосимо двовимірний масив для запам'ятовування значень функції: dp[x][y] = f(x, y).
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;
}Основна частина програми. Читаємо вхідні дані. Ініціалізуємо комірки масиву dp значенням -1. Викликаємо функцію f(x, y) і виводимо її значення.
scanf("%d %d",&x,&y);
memset(dp,-1,sizeof(dp));
printf("%lld\n",f(x,y));