3054 - Haywire

dp[i] 状态i(表示已经选中若干奶牛作为最左侧的奶牛,i是一个0/1串,第x位为1表示选中了第x头奶牛)的线路长度总和

线路长度总和是指状态i内所有奶牛,如果其某一个朋友也在状态i内,那么就正常配对(建造线路),如果其朋友不在状态i内,那么就暂时和最右边的配对

sum[i] 表示状态i下还有多少对奶牛未配对。

dp[i]=\min_{0 \leq j < n,(1<

转移即考虑最后一头奶牛是哪头奶牛,除了最后一头奶牛外,前面的奶牛的,其中未配对的需要从倒数第二个奶牛,另外转移到倒数第一头奶牛,每一组配对的距离多加了1,未配对数是sum[i \oplus (1<

以样例数据为例:

i=27表示前4头奶牛是1245,如果顺序是上图是2154,其中2和3、1和6、5和6、4和3的朋友关系暂时先和最右边的4配对(虚线表示),(如果这个顺序是最优解)dp[27]=12;

当状态59从状态27转移时,相当于是在最右边添加了奶牛6,之前所有未匹配的4对关系的最右端均右移了一格(当然其中1和6、5和6的配对成功了,之后不会再参加右移了),新增了6的未配对朋友3(暂时指向自己,所产生的距离为0),(如果这个转移是最优解)dp[59]=dp[27]+4=16;