Light Oj 1194 colored T-shirts 经典状压dp

该博客介绍了一道与2014微软编程之美复赛相似的题目,涉及颜色排序的动态规划问题。博主首先预处理序列中的颜色对计数,然后通过状态压缩来表示序列状态。在状态转移过程中,从大到小枚举状态,并计算转移代价。博客提供了正向转移的代码段。
摘要由CSDN通过智能技术生成

这道题跟2014微软编程之美复赛的一道机器人是一模一样的题。。

首先预处理, cnt[i][j] =记录的是 在这个序列中可以取出的  不同的 <i, j> 对 ,(注意这里的i,j不是下标而是数), 而这个的意义是, 假如这个序列只存在i和j这两个数, 那么把i全部交换到j之前所花费的交换次数(毕竟每次交换i,j,就相当于少了一个<i, j> 对);

然后进行状态压缩, 0代表这种颜色已经全部都聚集在一起并且 所有已经聚集在一起的颜色 都已经移到了右边, 如(1, 1, 1, 2, 2, 3, 4, 3, 4, 3)这个就是0011这个状态,然后有两种转移方式, 一种是对于一个状态1010, 它可以由0010, 1000这两种状态转移而来, 那么枚举状态的时候就要从大往小, 另外1010也可以转移到1110,或者1011, 这时枚举状态的时候就要正向循环,而转移的时候, 要把第i位由0变成1, 那么花费就是sigema(cnt[i][x])(1 < x <n, 且第x种颜色还没有全部聚集在一起(即(s >> 1 & 1) == 0);

下面是正向转移的代码(逆向其实差别不大):

#include <set>
#include &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值