【状压dp】poj2978 Colored stones
来源:互联网 发布:linux textinfo安装 编辑:程序博客网 时间:2024/06/04 18:57
题意:给一个序列,每个数字代表一种颜色,表示一串彩色的石头,现在要从中拿走一些,使得剩下的石头中颜色相同的都连在一起,也就是颜色相同的部分中间不能插入其他颜色的石头。石头数m(原题是k) <= 5,总石子数n <= 100,。
我们从“拿走一些石头,使得剩下的石头数最多”逆向考虑。或者说,从原数字序列中选出一个子序列,使得子序列长度最长,并且满足上面的颜色要求。
可以定义:dp[i][j][k]表示前i个,以颜色j结尾,已经选取的颜色的方案为k得到的最长的子序列。k可以用二进制压缩,状态有0~(1<<(m+1))-1。总的dp状态只有最多约100*5*(1<<6),30000+,非常少。
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int INF = 0xfffffff;const int MAX = 107;const int MAX_K = 6;int dp[MAX][MAX_K][1<<MAX_K|1]; //dp[i][j][k]: 前i个,以j颜色结尾,选取颜色为k可以保留的最长串。 int a[MAX];int main() {int n, m;while (~scanf(" %d %d", &n, &m) && (n + m)) {for (int i = 1; i <= n; ++i) {scanf(" %d", a + i);--a[i];}//color num: 0 ~ m-1memset(dp, 0, sizeof(dp));for (int i = 1; i <= n; ++i) {dp[i][a[i]][1<<a[i]] = 1;}//initfor (int i = 1; i < n; ++i) {for (int j = 0; j < m; ++j) {for (int k = 0; k < (1 << m); ++k) {if (dp[i][j][k]) {if (a[i+1] == j) {dp[i+1][j][k] = max(dp[i+1][j][k], dp[i][j][k] + 1);} else if ((1 << a[i+1]) & k) {dp[i+1][j][k] = max(dp[i+1][j][k], dp[i][j][k]);} else {dp[i+1][j][k] = max(dp[i+1][j][k], dp[i][j][k]);dp[i+1][a[i+1]][k|(1 << a[i+1])] =max(dp[i+1][a[i+1]][k | (1 << a[i+1])], dp[i][j][k] + 1);}}}//for1}//for2}//for3int ans = 0;for (int i = 0; i < m; ++i) {for (int j = 1; j < (1 << m); ++j) {if (dp[n][i][j] > ans) ans = dp[n][i][j];}}printf("%d\n", n - ans);}return 0;}
0 0
- 【状压dp】poj2978 Colored stones
- POJ2978-Colored stones(状压dp)
- ZOJ3070 POJ2978 Colored stones,压缩状态DP
- poj2978——Colored stones
- POJ 2978 Colored stones(状压DP+逆向思维)
- pku 2978 Colored stones(枚举+DP)
- [poj 2978]Colored Stones[状态压缩DP]
- ZOJ3070-The Colored Stones - 状态压缩dp
- POJ 2978 Colored stones
- 状压DP LIGHTOJ 1194 Colored T-Shirts
- lightoj 1194 - Colored T-Shirts 状压DP
- (中等) 动态规划+搜索 HOJ 2156 Colored stones
- HOJ 2156 &POJ 2978 Colored stones(线性动规)
- Light OJ 1194 Colored T-Shirts (状压DP)
- [分块 + DP] Candies and Stones
- pangu and stones(区间dp)
- Stones
- Stones
- 程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。
- spring MVC 配置文件解析
- Android™ 2.1 android.R.drawable Icon Resources
- zoj 3466 The Hive II(插头dp)
- 金额大,小写转换
- 【状压dp】poj2978 Colored stones
- source insight UTF-8 乱码解决
- Redis主从复制问题和扩容问题的解决思路
- dddddddd
- 一直说要改变却从未开始
- /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别
- elasticsearch源码解析---AllocationDecider
- DataGridView控件---绑定数据方法
- test