noip2013花匠-题解

该题是求最长抖动子序列。其实按照奇偶来理解也是可以的,就是其中一种情况奇数项的大,偶数项的小,而另一种情况相反。但理解为抖动则更加直观,分成降到该项和升到该项两种情况,这个不是主要问题。

主要的问题是状态的转移上,有两种方案:

一:

下面h是高度,f[i][0]表示从h[j]上升到h[i]并且以i为结尾的最长抖动序列,f[i][1]则是下降。

f[i][0]=max{f[j][1]}+1,1≤j

f[i][1]=max{f[j][0]}+1,1≤jh[i];

这一种方案是将第i个选上,记录了最后一个的状态,甚至连具体的位置信息也保留连,因此转移的时候相对容易,然而转移的复杂度高,达到O(n^2),无法满足需要。

二:

h是高度,f[i][0]表示考虑前i个,但不知道最后一个选中的是谁,只知道最后选中的这一个比由前一个高度要高。f[i][1]相反。

先给个答案吧,再来看为什么:

h[i]>h[i−1]时,

f[i][0]=max{f[i−1][0],f[i−1][1]+1},f[i][1]=f[i−1][1];

h[i]==h[i−1]时,

f[i][0]=f[i−1][0],f[i][1]=f[i−1][1];

h[i]

f[i][0]=f[i−1][0],f[i][1]=max{f[i−1][1],f[i−1][0]+1}.

这一种方案是正解。关键在于只保存了1~i区间内最后一个的部分性质,并没有指明最后一个是哪一个,乍一看确实难以写出递推式,但是考虑之后又能够巧妙的消除这种不确定性,从而大大减少复杂度,是优化状态设计从而优化复杂度的极好例子。下面证明递推式的正确性:

noip2013花匠-题解_第1张图片

这个题很具有启发性,所以在这里详细说明。

你可能感兴趣的:(提高组题解,动态规划)