こうやると再帰呼び出しの回数が劇的に減って速い
VS2010な

#include <stdio.h>
#include <map>
#include <tuple>
int tar(int x, int y, int z);
std::map<std::tr1::tuple<int, int, int>, int> mtiii;
int main(void)
{
int x, y, z;
printf("x = ");
scanf("%d", &x);
printf("y = ");
scanf("%d", &y);
printf("z = ");
scanf("%d", &z);
printf("TAR(%d,%d,%d) = %d\n", x, y, z, tar(x, y, z));
std::getchar();
}
int tar(int x, int y, int z)
{
if (x <= y)
return y;
else
if (mtiii[std::tr1::tuple<int, int, int>(x, y, z)])
return mtiii[std::tr1::tuple<int, int, int>(x, y, z)];
else {
mtiii[std::tr1::tuple<int, int, int>(x, y, z)] = tar(tar(x - 1, y, z), tar(y - 1, z, x), tar(z - 1, x, y));
return mtiii[std::tr1::tuple<int, int, int>(x, y, z)];
}
}