迟来的感悟。。。
今天的题目我炸的很惨。。。所以,感悟什么的暂时不想写,看情况再补吧 。。(我太弱了,写不了这么佛的题)
昨天没收到包,所以自然无法写。。。
总结
1. 一鼓作气,三道暴力。结果竟然是3道dp。。。(dp应用真广泛。。。)
2. 先考虑部分分的情况,也许满分算法要用到。
实战
T1
40分:暴力(n^8)
60分:暴力+二维前缀和优化(n^6)。
100分:先枚举横着切的情况(n^3),至于竖着切可以考虑二分答案优化,每次检查的时候竖着向下扫描。//这个应该很好理解
这样总复杂度为(n^4 * logn)
当时我满分算法没想到,只好写60分的算法
题解上还提供了dp的算法,虽然只写了几个字:先枚举横向切分再决策单调性 DP,表示不是很懂。。。
T2
1.这道题xyx说要用树型dp,我当时不是很懂。。。
50分的算法是先建立 一棵包含所有关键点的最小树 ,然后枚举原树上每个点与这棵最小树上的点的最小距离,然后计算一下即可。
(找最小的距离貌似可以dfs一遍解决,不过最后计算貌似还是要O(n),所以总复杂度为O(n^2)。)
100分的算法就是 用树形dp优化上述过程,当时表示没听明白。。。
T3
我们先看40%的情况,m=1。
显然是将n个数分成1,2,3……x-1,x 这样k+1组,要使它们的之最小,显然是让它们尽可能的均匀。然后慢慢推公式(应该还是比较好推的)
将答案记为D(n,k) //后面的算法要用到。
然后我们就可以在O(1)的时间内求出D(n,k)
下面是满分算法。。。
首先奶牛每个牛棚都是互相独立的,奶牛进去的次序是没有任何影响的。
然后我们只需把每个牛棚当成一个整体计算即可。
然后我们可以考虑dp。
f[i][j]=min(f[i-1][j-k])+D(s[i],k) //s[i]表示第i个牛棚中奶牛的数量
这样总时间复杂度为O(m^2*k)是完全没有问题的。
其实O(m^2*k)的dp,我是想出来的,只是我不知道m=1的时候怎么求。。。
然后我预处理D(n,k)时又用了一个时间复杂度O(n^2*k)的dp求出所有D(n,k)的值,最后导致严重爆炸。。。