原题链接http://codeforces.com/contest/448/problem/C
题意大概是有n列篱笆,每列宽度都为1,高度为hi,现在有一把刷子宽度为1,每次刷不能改变方向,要么横着刷要么竖着刷,可以刷任意长度,但是方向不能改变,问最少刷多少次能把篱笆刷完。
仔细想一下,发现顶多刷n次就能够刷完,所以最多不会超过n次。而且如果某一列有横着刷的部分,那么下面都是横着刷的,(想一下如果下面是竖着刷,那上面就没有刷的 必要了),所以答案必定要么是某一列一整列都是横着刷的,(反证一下,如果每一列都不是一整列横着刷的,说明n列至少竖着刷了n次再加上横着的就已经>n了,显然不对的);要么当然还有可能是都是竖着刷,答案就是n了。
我们利用答案这个特性,可以想出一个dp状态,记dp[i][j]为前i列全部刷完后,第j列一整列都是横着刷的最小次数,
在h[1]前面加多一个h[0]= 0 ,表示一列都不横着刷的状态,
记minx(j,i