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