OO第一单元优化博客
第一次作业:
合并同类项+提正系数项+优化系数指数0/1=满分
第二次作业:
初始想法
一开始是想以\(sin(x)\)和\(cos(x)\)的指数作为坐标,在图上画出来就可以发现,两个坐标分别为\((a,b+2),(a,b+2)\)的点能够合成\((a,b)\)的点。
现在我们推广开来,假设有系数分别为为1,2,1的三个点\((a,b+4),(a+2,b+2),(a+4,b)\)即可合成一个\((a,b)\),即,若一排连续的\(n\)个点系数满足杨辉三角第\(n\)行也即组合数,那么他们就能合成一个点。
当坐标即指数和比较小时,可以将所有点先反向拆分到坐标和最大那一排,再用若干次组合数去凑,次数小于\(n-1\)次,项数就会减少。
但这种算法局限性太大,不好实现,面对指数较大的数据只能分局部做。
自暴自弃
既然无法贪心,只好搜索。
dfs,每次找到可合并的两个项去合并,然后回溯,不断记录最短答案,其中,两个项合并的次数(即合并之后的系数)要满足至少要用完其中一个项。
改完dfs发现要T(爆栈),就把每次dfs前的答案扔进set判重,即记忆化。
合并的话一开始只考虑了\(sin(x)^2+cos(x)^2=1\)然后用\(1-sin(x)^2=cos(x)^2\)以拆分常数项 和不含\(sin(x)\)或\(cos(x)\)的项来体现。后来发现速度很快但效果不好。
在队友丁总对我的指导下,我把\(1-sin(x)^2=cos(x)^2\)放进了dfs,成为合并两个项的新选择。
关于极端数据爆栈,卡住dfs次数和程序运行时间即可。最终性能分满分。
正常随机数据或项数不多的数据可以随便跑完,评论区里面的数据应该都能搜完。
欢迎大佬们批评指正,本数学弱鸡,码力选手只能想到这种暴力做法,写了快10k的优化类,累死。
第三次作业:
使用前面的架构,用一个三元组表示一个乘积项,分别表示系数、x的指数、一个常量String。对于每个表达式,在求导结束后,对它的原函数和导函数的set做一次\(O(n^2)\)的合并,合并x的系数和常量String都相等的项。原本输出就不含系数指数为0/1的,而且没有一个多余的括号。
实际测试发现,对于随机出来的含嵌套的数据表现非常好,一般能达到不合并的15%左右,比其他一些架构的优化更有效,性能分几乎满分。无奈此次强测数据过于水,无法体现此架构的优势,惜拿96.2分。