题意:
有很多筷子,每个筷子的长度不同,每个人用三支筷子,假设这三只筷子的长度为 A,B, C( A <= B <= C ) 则 badness 为( A - B )^2
现在有K+8个人,要求选出K+8组筷子,使总badness最小
首先状态转移方程不用多说 dp【i】【j】 表示从前j只筷子 选出 3*i只 来供前i个人使用
dp[i][j] = min( dp[i][j], dp[i-1][j-2] + ( num[j] - num[j-1] ) * ( num[j] - num[j-1] ) );
dp[i][j] = min( dp[i][j-1], dp[i][j] );
但是这样有一个问题,你选出了i对筷子后,还需要有更长的筷子来配对,才能供一个人使用!
这怎么办呢?
只需要对筷子长度从大大小排序,然后在转移的时候满足 3 * i <= j
为什么呢?
不好讲,你想一想递推的过程就可以知道,从最开始就能满足题目要求。。。。。。。。
AC代码如下: