2017.8.14个人感悟

来源:互联网 发布:雨过天晴还原软件 编辑:程序博客网 时间:2024/05/18 00:32

迟来的感悟。。。

今天的题目我炸的很惨。。。所以,感悟什么的暂时不想写,看情况再补吧 。。(我太弱了,写不了这么佛的题)

昨天没收到包,所以自然无法写。。。


总结

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)的值,最后导致严重爆炸。。。