题目链接:http://acm.swust.edu.cn/problem/0581/

Time limit(ms): 1000        Memory limit(kb): 65535
 
Description
把m个含有k种不同颜色的石子放成一条线上。现在要问你怎么才能取走 
最少的石子,使得没有两个相同颜色的石子之间含有其它的颜色

 
Input
有多组测试数据,每组测试数据有两行,第一行是m和k,1<=m<=100, 
1<=k<=5,第二行就是那m个石子的颜色,用1到k表示,最后输入0 0表示 
程序结束。

 
Output
对于每组测试数据,请你找出最少取走的石子数目并输出

 
Sample Input
10 3
2 1 2 2 1 1 3 1 3 3
0 0
 
Sample Output

2
 
解题思路:状态压缩dp,一共最多5类石子,那么
(1)dp[1<<5][5]用来表示(二进制每一位对应)是否含有第k类石子,表示以第k类石子结尾含有1<<5(二进制数)每一位对应种类石子下的可行序列最大值
(2)题目中给出的种类是从1开始的这里我们要转化为从0开始否则1<<6浪费空间(算一个小小的优化吧~~~)
(3)在0-1<<5中查找不同的状态i&(1 << x) 表明前面含有x类石,那么可以直接dp[i][x]++
(4)在(3)执行完以后,如果!(i&(1 << x)) 加一生成的新段如果此时dp值大于相同状态的值,更新即
for (L = ; L < k; L++){
  if (L != x && dp[j | ( << x)][x] < dp[j][L] + ) //不含x类的段加一生成的新段如果大于相同状态的值,更新
  dp[j | ( << x)][x] = dp[j][L] + ;
}

(5)最后查询所有dp[1<<k-1][i]状态下的最长可行序列,用总长度减去即可

dp方程总结如下

每输入一个x

if(s&(1<<x)
dp[s][x] = dp[s][x] + 1
else
dp[1<<x|s][x] = max(dp[1<<x|s][x],dp[s][L]+1) L(0,k)

  

代码如下:

 #include <iostream>
#include <cstring>
using namespace std;
int main(){
int m, k, dp[ << ][];
//dp[][k] 二进制每一位对应含有第k类石子,表示以第k类石子结尾含有1<<5每一位对应下石子的最大值
while (cin >> m >> k, m || k){
int i, x, j, L, t = << k, maxn = ;
memset(dp, , sizeof(dp));
for (i = ; i < m; i++){
cin >> x;
x--;
for (j = ; j < t; j++){
if (j&( << x)) //对于前面也是以x类石子结尾的最大值直接加1
dp[j][x]++;
}
for (j = ; j < t; j++){
if (!(j&( << x))) //前面不含x类石子
for (L = ; L < k; L++){
if (L != x && dp[j | ( << x)][x] < dp[j][L] + ) //不含x类的段加一生成的新段如果大于相同状态的值,更新
dp[j | ( << x)][x] = dp[j][L] + ;
}
}
}
for (i = ; i<k; i++)
if (dp[( << k) - ][i]>maxn)
maxn = dp[( << k) - ][i];
cout << m - maxn << endl;
}
return ;
}

[Swust OJ 581]--彩色的石子(状压dp)的更多相关文章

  1. Light OJ 1011 - Marriage Ceremonies(状压DP)

    题目大意: 有N个男人,和N个女人要互相匹配,每个男人和每个女人有个匹配值. 并且匹配只能是1对1的. 问所有人都匹配完成,最大的匹配值是多少?   状压DP,暴力枚举就OK了, 这个题目略坑,因为他 ...

  2. power oj 2480 放积木[二进制状压DP]

    题目链接[https://www.oj.swust.edu.cn/problem/show/2480] 题意:中文题目. 题解:二进制状态转移+坏点判断. #include<cstdio> ...

  3. 江南OJ 1151 - 还是晒太阳 - [状压DP]

    题目链接:校内OJ的题目,就不放链接了. PS.可以说是本次9月月赛唯一的一道有一定难度的题目了. 题解: 考虑状压DP,假设 $sta$ 是一个二进制数,代表当前 $n$ 个人有几个是在队伍里的,剩 ...

  4. HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)

    题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...

  5. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  6. bjtu 1846. Infinity的装备[状压dp+dfs/bfs]

    https://citel.bjtu.edu.cn/acm/oj/problem/1846 1846. Infinity的装备 时间限制 1000 ms 内存限制 64 MB 题目描述 “测试服终于下 ...

  7. 算法复习——状压dp

    状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...

  8. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  9. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

随机推荐

  1. uestc 10 In Galgame We Trust

    题意:求最长的合法括号序列 解:栈+分类讨论 now表示已经算出的序列,且此序列与现在扫描的序列可能能够连接,tmp表示现在扫描到的序列长度 左括号入栈 右括号:1.栈空时:统计当前总长 并且将栈,n ...

  2. poj2509---抽k根烟就换一支,求能抽烟的总数

    #include <stdio.h> #include <stdlib.h> int main() { int now,k; while(scanf("%d %d&q ...

  3. 从麦肯锡到小黑裙-Project Gravitas |华丽志

    从麦肯锡到小黑裙-Project Gravitas |华丽志 从麦肯锡到小黑裙-Project Gravitas

  4. java 集合类说明与区别

    集合类说明及区别Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap ...

  5. mysql错误-更改mysql.sock位置

    于Mysql在有时会出现mysql.sock定位误差,会造成不连接数据库. mac由当时的误差: 第一个变化my.cnf 位置/etc/my.cnf下一个,如果没有,那么.跟/usr/locate/m ...

  6. c#学习已经停止了

    为了养家糊口,没有时间学习c#.

  7. 性能优化工具---iostat

    Iostat (参考 man iostat) 可选项: -c为汇报CPU的使用情况: -d为汇报磁盘的使用情况: -k表示每秒按kilobytes字节显示数据: -t为打印汇报的时间: -v表示打印出 ...

  8. css3 动画(animation)-简单入门

    css3之动画(animation) css3中我们可以使用动画,由于取代以前的gif图片,flash动画,以及部分javascript代码(相信有很多同学都用过jquery中的animate方法来做 ...

  9. mywebsite1

    http://www.wuweierwei.com/ 个人网站 http://www.yyyweb.com/demo/icons-filling/index.html CSS3图标填充效果 http: ...

  10. justAP1.3.0版发布了

    justAP是一个简单的.易于使用的php运行环境,适合php开发人员使用.与wamp.xampp等不同,它仅仅包含Apache httpd和Php,这也是它名字的来由(justAP=just Apa ...