在尝试提高我对本次比赛的回答速度时,我有一个函数,它接受两个值n
并k
产生一个输出。计算是重复的,所以我要记住它。我不能使用二维数组,因为n
and的约束k
是10^5
! 所以我正在使用地图:
std::map<std::pair<int,int>,double> m;
double solve(int n, int k)
{
if(k==0) return n;
if(k==1) return (n-1)/2.0;
std::pair<int,int> p = std::make_pair(n,k);
std::map<std::pair<int,int>,double>::iterator it;
if( (it=m.find(p)) != m.end())
return it->second;
double ans = 0;
for(int i=1 ; i<=n-1 ; i++)
ans += solve(i,k-1);
ans = ans/n;
m[p] = ans;
return ans;
}
但显然,这种方法太慢了。我的记忆有问题吗?或者我可以像数组一样获取恒定时间而不是从地图中获取对数?
这个函数解决了这个重复:
f(x,0) = x
和f(x,1) = (x-1)/2
这可以用更好的方式解决吗?提前非常感谢。