NOIP最难的部分:动态规划

当我们上小学时,如果说奥数是最恶心的,虚无缥缈,极其难学的很好,那么,在信息学竞赛中,至少在NOIP,动态规划一定是最最最难的。它不仅需要oier具有良好的逻辑能力,而且数学水平得好。况且很多时候,规律隐藏的很深,没有之前疯狂的练习,在有限的时间内,根本搞不定。下面推荐几道题目,在codevs都可以做。

openjudge 取数游戏:你可以从中取走任意个数,但是相邻的两个不可以同时被取走。你能算出一共有多少种取法。 这道题显而易见有两种状态,取或是不取,那么对于第i位的数,若取,那么i-1必然不取,若不取,那么i-2位有可能取也有可能不取,但是因为i-2算入了其他的情况,所以这道题其实就是斐波拉契数列

codevs1085

NOIP最难的部分:动态规划_第1张图片

显而易见,这道题是dp题,关键难在状态设计和环上,由于题面上任一点都可以是队列的起点,所以首先要枚举队列的起点,然后,共有m组,这也是要枚举的,其次,对于第k组,可以有第k-1组*j-i作为第k组的值所构成。

 so,f[k][i]=max(f[k][i],f[k-1][j],sum(i+起点,j+起点));

最大全0矩阵

题目意思很简单,给出一个矩阵,矩阵中每个数为1或0,要我们求一个最大的全0矩阵。

做法:需要用到悬线法,分别求出每个点最多向上,向左,向右可延伸的距离。

没有上司的舞台:

简单树形dp,题意为不能同时出现顶头上司和下属在一块,由于公司人员关系为一棵树,对于每个人都有选与不选的两种状态。我们用f[i][0]表示不选i节点,同理f[i][1]表示选i节点。那么若j为i节点的儿子集合,则:

          f[i][1]=max(f[i][1],f[i][1]+f[j][0]),f[i][0]=max(f[i][0],f[i][0]+max(f[j][0],f[j][1]));

 

 

 

你可能感兴趣的:(高中NOIP,C++)