[poj 2978]Colored Stones[状态压缩DP]
题意:
给出n个石子,一共m种颜色.问最少去掉几个石子使得同种颜色全连续.
思路见注释.
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std; const int kMAX=105; /// dp[x][y][z],x指的是[到达第x个石子,包含(意思是参与讨论,并不是说一定留下)第x个石子]的情况下,颜色组合为y(每种颜色占一位),
/// 最后一颗石子的颜色为z的最多剩余石子数,因为[第x颗石子去留不一定],所以z不一定等于x的颜色
int dp[kMAX][1<<6][6]; int main()
{
int n,m,tmp; while(scanf("%d%d",&n,&m)==2 && (n+m))
{
memset(dp,0,sizeof(dp));
int len=(1<<m);//状态的总数
for(int i=1;i<=n;++i)//一颗一颗拿石子
{///拿起一颗石子,要进行两重循环:遍历所有的颜色组合->遍历所有的结尾种类
///i是递增的,而后两维则根据选择的情况来确定
scanf("%d",&tmp);
--tmp;//编号修正,可直接对应位置
for(int j=0;j<len;++j)
{
for(int k=0;k<m;++k)///对于每种颜色k结尾的情况
{
if(!(j&(1<<tmp))) /// 如果第i颗石子的颜色[不存在于当前研究的状态j中]
{
dp[i][ j|(1<<tmp) ][tmp] = max(dp[i][ j|(1<<tmp) ][tmp], dp[i-1][j][k]+1);///使用这颗石子
///使用这颗石子时,所对应的dp下标随之转移.x坐标跳转到更靠下的位置(也就是第二维)
///当只改变k时,上式左边对应的位置是不变的.对于不同的k,选择出一种方案使得左值最大(max使得其达到最大时可以保持住) /**昨天的数位dp预处理(HDU3555Bomb)都是确定的转移关系,而对于"选择最佳方案"类的dp问题,一般是取最值的(如背包)**/ ///两重循环,只是保证了每种情况都会check一遍,并不是说在当前循环中就一定填哪个位置.
///从这个层面上说,体现了Dynamic.这也解释了为什么需要取max:因为这个位置可能之前已经填过了,
///也就是通过之前的某种路线已经到达过这个状态,取max就是动态的选取最优的路线.数值已经刻画了选择的历史. dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k]);///不用这颗石子
/// 不用这颗石子时,因为一样是讨论到了i,所以同样要更新 ///总的来说,每次更新都不能直接覆盖原来的值,而要去max,以免覆盖了之前已经达到的可行的方案.而且总不会出错.
}
else /// 如果第i颗石子的颜色[存在于当前研究的状态j中]
{
if(k == tmp)
dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k]+1);
/// 如果第i颗石子的颜色和在i前面剩余石子中的最后一颗石子颜色一样,则i必定留下来
else
dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k]); /// 否则就不留
}
}
}
}
int ans=0;
for(int k=0;k<m;++k)
for(int j=0;j<len;++j)
ans=max(ans,dp[n][j][k]);
printf("%d\n",n-ans);
} return 0;
}
自己敲一遍~
#include <cstdio>
#include <cstring>
using namespace std;
int max(int a, int b)
{
int diff = b - a;
return b - (diff & (diff >> 31));
}
const int MAXN = 105;
int dp[MAXN][1<<6][6];
/** 324K 0MS
dp[i][j][k]:
dealing with the i-th stone
with status j
end up with color k;
**/
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)==2 && (n+m))
{
memset(dp,0,sizeof(dp));
int tmp;
int len = 1<<m;
for(int i=1;i<=n;i++)
{
scanf("%d",&tmp);
tmp--;
for(int j=0;j<len;j++)
{
for(int k=0;k<m;k++)
{
if(!(j & (1<<tmp)))
{
dp[i][j|(1<<tmp)][tmp] = max(dp[i][j|(1<<tmp)][tmp],dp[i-1][j][k]+1);
dp[i][j][k] = max(dp[i][j][k],dp[i-1][j][k]);
}
else
{
if(k==tmp)
dp[i][j][tmp] = max(dp[i][j][tmp],dp[i-1][j][tmp]+1);
else
dp[i][j][k] = max(dp[i][j][k],dp[i-1][j][k]);
}
}
}
}
int ans = 0;
for(int j=0;j<len;j++)
for(int k=0;k<len;k++)
ans = max(ans,dp[n][j][k]);
printf("%d\n",n - ans);
}
}
[poj 2978]Colored Stones[状态压缩DP]的更多相关文章
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- POJ 1321 棋盘问题(状态压缩DP)
不总结的话, 同一个地方会 WA 到死 思路: 状态压缩 DP. 1. s 表示压缩状态, 若第 i 列放了棋子, 那么该列置 1, 否则该列置 0. 假如 s = 3(0x011) 那么表示棋盘的第 ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- POJ 3254 Corn Fields (状态压缩DP)
题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...
- HOJ 2156 &POJ 2978 Colored stones(线性动规)
Colored stones Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1759 Accepted: 829 Descrip ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 3254 Corn Fields 状态压缩DP (C++/Java)
id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...
- POJ 3254 Corn Fields状态压缩DP
下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
随机推荐
- Python爬虫实战(2):爬取京东商品列表
1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...
- 给新建的Cocos2d-x 3.X的Win32工程添加CocoStudio库
1.我们在VS中找到"解决方案资源管理器", 在解决方案"HelloCocos"上点击右键, 选择添加现有项目. 在弹出的对话框中选择************* ...
- QueryString和BASE64
加号(+)是BASE64编码的一部分,而加号在QueryString中被当成是空格.因此,当一个含有BASE64编码的字符串直接作为URL的一部分时,如果其中含有加号,则使用QueryString读取 ...
- Mozilla推荐的CSS书写顺序
//显示属性displaylist-stylepositionfloatclear //自身属性widthheightmarginpaddingborderbackground //文本属性color ...
- 克鲁斯卡尔(Kruskal)算法
# include <stdio.h> # define MAX_VERTEXES //最大顶点数 # define MAXEDGE //边集数组最大值 # define INFINITY ...
- 日本語N1文法まとめ
1.v连用形+ものの:虽然~但是(201212-32) -(の)かというと/かといえば(201412-38)a动词ます辞書形・た形/イ形+~ な形語幹/名+~a,"至于是否・・・・・・&qu ...
- 一封在JSP课程结束之后给学生的信
<JSP应用程序设计>这门课终于考完了,虽然题目有点难,但我看大部分同学考的还可以,算上平时成绩应该都能拿到一个满意的分数. 再次感谢大家一个学期来对我的支持,跟大家一起的这个学期很开心, ...
- linux下创建可引导的U盘系统,使用dd命令进行Linux的ghost
1,通过iso创建可引导的U盘系统. 1.0,格式化U盘为FAT32格式 linux下能够使用命令: mkfs.vfat U盘的设备路径 比如: mkfs.vfat /dev/sdb 当中U盘的路径能 ...
- 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值
实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...
- 让ie支持placeholder属性,一段js搞定
placeholder属性真的是超级好用的新属性,可惜,只有新版浏览器才支持,为了写出输入框贴心提示,老方法就是加span标签覆盖,营造出placeholder提示的感觉,现在安利一款好用的js,好用 ...