题目链接:Click here

Solution:

状压dp,考虑\(f[i][j][k]\)表示当前到了第i个石头,颜色状态为j,选取的最后一个石头颜色为k时能够留下的石头的最大数量

转移也很好转移,枚举所有状态,再枚举上次转移过来的状态的最后一个颜色,然后暴力转移就行了

最后查找一下所有情况下的最大值,输出n-max就行了

Code:

#include<cstdio>
#include<ctype.h>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,f[101][(1<<8)-1][7];
int b[7]={0,1};
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
for(int i=2;i<=6;i++) b[i]=b[i-1]*2;
begin:n=read(),m=read();
if(n==0&&m==0) return 0;
memset(f,0,sizeof(f));
int num=b[m+1]-1,ans=0;
for(int i=1;i<=n;i++){
int x=read();
for(int s=0;s<=num;s++){
if(!(s&b[x]))
for(int j=1;j<=m;j++){
if(!(s&b[j])) continue;
f[i][s|b[x]][x]=max(f[i][s|b[x]][x],f[i-1][s][j]+1);
f[i][s][j]=max(f[i][s][j],f[i-1][s][j]);
}
else
for(int j=1;j<=m;j++){
if(j==x) f[i][s][x]=max(f[i][s][x],f[i-1][s][j]+1);
else if(s&b[j]) f[i][s][j]=max(f[i][s][j],f[i-1][s][j]);
}
}
}
for(int i=1;i<=m;i++)
for(int s=0;s<=num;s++)
if(s&b[i]) ans=max(ans,f[n][s][i]);
printf("%d\n",n-ans);goto begin;
}

最新文章

  1. 敲-PHP与MySQL,JSON
  2. ubuntu14.04显卡驱动问题(amd5600k集显7650d)
  3. MyBatis XML 映射配置文件
  4. .net下连接数据库
  5. Java实现希尔排序(增量递减排序)
  6. android 随手记 倒计时
  7. [转帖]SD卡&amp;FLASH&amp;USB
  8. UICollectionView请求网络数据显示(Text)
  9. DOTween坑点
  10. 广工赛-hdu6468构造十叉树
  11. Direct3D 11 Tutorial 3: Shaders and Effect System_Direct3D 11 教程3:着色器和效果系统
  12. 1、JDBC-Connection
  13. Ant+Jmeter自动化接口测试的部署 及 部署过程中的坑
  14. winform下picturebox控件显示图片问题
  15. powerdesigner-ER图建模
  16. Centos 7 安装后设置
  17. ASP.NET 关于GridView 表格重复列合并
  18. http和https的优缺点,区别与工作原理
  19. poj 2226 二分图 最小点覆盖 , 最大流
  20. solr删除全部索引数据

热门文章

  1. (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试
  2. CF498B Name That Tune(动态规划dp)
  3. SQL 生成表结构表数据脚本
  4. 直线的Bresenham算法
  5. 移动端 h5 适配之必知必会
  6. ArcGIS 在VS2010中 ESRI.ArcGIS.SOESupport.dll 无法正常加载的处理
  7. springboot项目抓数据后优化配置及四个补充
  8. 6.纯css绘制叮当猫
  9. 教你搭建基于typescript的vue项目
  10. lvs工作方式和调度算法