下课了, Polo 来到球场,但他到了之后才发现……被放了飞机……
无事可做的他决心找点乐子,比方说……跳台阶……
球场边有 N 个台阶拍成一行,第 i 个台阶的高度是 Hi(0<Hi<=10^9),第 0个台阶,也就是地面的高度为 0。
Polo 打算把这 N 个台阶分成两个集合 Sa,Sb(可以为空),对于一个台阶集合 S={P1,P2,…P|S|},
其中 P1<P2<…<P|S|,他需要花费 的体力值来完成。
现在他希望两次跳跃所需的总体力值最小,你能帮帮他吗?
考虑一个O(n^2)DP,我们假定 f [ i ] [ j ] f[i][j] f[i][j]表示 A A A集合以 i i i结尾, B B B集合以 j j j结尾, i > j i>j i>j。我们画个图就可以发现 当 i , j 之 间 有 空 格 的 时 候 , f [ i ] [ j ] = f [ i − 1 ] + a b s ( h [ i ] − h [ i − 1 ] ) , i > j + 1 当i,j之间有空格的时候,f[i][j]=f[i-1]+abs(h[i]-h[i-1]),i>j+1 当i,j之间有空格的时候,f[i][j]=f[i−1]+abs(h[i]−h[i−1]),i>j+1没有空格的时候我们要枚举 f [ i ] [ i − 1 ] = m i n ( f [ i − 1 ] [ k ] + a b s ( h [ i ] − h [ k ] ) + a b s ( h [ i ] − h [ k ] ) f[i][i-1]=min(f[i-1][k]+abs(h[i]-h[k])+abs(h[i]-h[k]) f[i][i−1]=min(f[i−1][k]+abs(h[i]−h[k])+abs(h[i]−h[k])可以理解为枚举B的长度(A,B)并不绝对,只是表示一个互异关系。 那么我们可以发现前者很好转移,后者不好转移,于是我们思考后者,其实我们发现后者的dp可以单独拿出来做记 g [ i ] = f [ i ] [ i − 1 ] g[i]=f[i][i-1] g[i]=f[i][i−1],则 g [ i ] = m i n ( g [ j ] + s u m [ i − 1 ] − s u m [ j ] + a b s ( h [ i ] − h [ j − 1 ] ) g[i]=min(g[j]+sum[i-1]-sum[j]+abs(h[i]-h[j-1]) g[i]=min(g[j]+sum[i−1]−sum[j]+abs(h[i]−h[j−1])同样可以理解成枚举集合长度。那么我们把绝对值拿掉就好做了,考虑做一个权值树状数组,一切就显然了。
