回复 10楼 sala0127
第四题如何确保前100位是正确的呢?就是如何确定要做多少次除法?第十题我想动规,用二维数据记录区间是否满足要求。
必须吐槽下第八题。。。题目写输出最少的翻转次数,我还以为会有多种可能。。就想都没想就去穷举。。结果却是只有唯一解只需扫描一遍就行了。。
第四题虽然按原公式计算结果在是以黄金分割点精确值为轴线的附近振荡衰减的,但每奇数次(或偶数次)计算的结果是单调逼近的。当然两次计算的结果的差值小于要计算到位的结果精度时就可以停止计算了。
第十题看怎么用动规了,计录所有的区间是不可行的,64M的空间限制是不足以容纳50000的数据范围的。而且按你的想法,其效率并不比直接统计来的高。事实上我说的直接统计也包含了一定的动规思想,比如已知了[i,j]区间的最大值和最小值,则对于[i,j+1],可以通过对比j+1的值与[i,j]的最值而得到[i,j+1]的最值,从而判断[i,j+1]是否是连号区间。
关于这第十题目前我的另一个思路是,设f(a,b)是区间[a,b]的连号区间的数量,设 i = (a + b) / 2,则
f(a,b) = f(a,i) + f(i+1,b) + c(i, i+1)
其中c(i,i+1)表示在区间[a,b]中包含[i,i+1]的子区间中连号区间的数量
如果用普通方法计算c(i,i+1),则这个算法模型并没有优势,现在我要做的是看能不能将c的计算复杂度降低,如果将c的计算时间复杂度降低到O(x),则计算f(1,n)的时间复杂度就可以降低到O(log(n)*x)。呵呵,我再想想。
至于第八题,我希望你能证明一下某种翻转方式只需进行0或1次(当然也可以进行多次,但它是多余的)。
重剑无锋,大巧不工