Help Bubu UVALive - 4490
传送门
题目大意
有n本书,最多k次操作,每次操作可以把一本书拿出来,放到一个位置去,有一个指标较mess度,他是书的高度的段数,连续的书高度一样算一段,现在给你最先开始各个位置上的书的高度,求操作后最小的mess度。
分析
首先我们要注意一个非常非常重要的条件就是书的高度的范围很小。所以我们不由想到了状压dp。我们再仔细思考一下不难想到dp[i][j][msk][k]表示考虑到第i本,挪动了j次,没挪动的书的高度集合为msk,没挪动的书的最后一本高度为k。然后我们便可以转移(具体见代码),而最后答案要将dp值加上对于所有高度为h的书都挪动了的不同h的数量。注意数组不要开小啦。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<queue> #include<ctime> #include<vector> #include<set> #include<map> #include<stack> using namespace std; #define gm(x,y) x=min(x,y) const int inf = 0x3f3f3f3f; int n,m,sum,dp[2][105][260][10],apr[50],c[105],cse,now; inline void init(){memset(apr,0,sizeof(apr));sum=0;cse++; } inline void deal(int pl,int x){if(!apr[x]){sum++;apr[x]=sum;}c[pl]=apr[x];return; } inline int Sum(int msk){int res=0;for(int i=0;i<sum;i++)if(((1<<i)&msk)==0)res++;return res; } inline void DP(){int i,j,k,s;now=1;memset(dp[1],0x3f,sizeof(dp[1]));dp[1][0][(1<<(c[1]-1))][c[1]]=1;dp[1][1][0][0]=0;for(i=1;i<n;i++){now^=1;memset(dp[now],0x3f,sizeof(dp[now]));for(j=0;j<=m;j++)for(s=0;s<(1<<sum);s++)for(k=0;k<=sum;k++)if(dp[now^1][j][s][k]<inf){//cout<<i<<' '<<j<<' '<<s<<' '<<k<<' '<<dp[now^1][j][s][k]<<endl;if(k==c[i+1])gm(dp[now][j][s][k],dp[now^1][j][s][k]);else gm(dp[now][j][s|(1<<(c[i+1]-1))][c[i+1]],dp[now^1][j][s][k]+1);if(j<m)gm(dp[now][j+1][s][k],dp[now^1][j][s][k]);}}return; } inline void getans(){int ans=inf,i,j,k;for(i=0;i<=m;i++)for(j=0;j<(1<<sum);j++)for(k=1;k<=sum;k++)gm(ans,dp[now][i][j][k]+Sum(j));printf("Case %d: %d\n\n",cse,ans); } int main(){int i,j,k;cse=0;scanf("%d%d",&n,&m);while(n&&m){init();for(i=1;i<=n;i++){scanf("%d",&c[i]);deal(i,c[i]);}DP();getans();scanf("%d%d",&n,&m);}return 0; }
转载于:https://www.cnblogs.com/yzxverygood/p/9483808.html
Help Bubu UVALive - 4490相关推荐
- uvaLive 4490 Help Bubu 帮助布布 等价转化+DP
等价转换: 从有n本书的书堆里面抽取k本书,再插入书堆里面,计算书的杂乱度 等价于 向空的书架上按给出的顺序放上n本书,再从中抽取k本书,然后插入书堆里面,计算书的杂乱度 等价于 向空的书架上按给出的 ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...
- The UVALIVE 7716 二维区间第k小
The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...
- 2020年球云计算市值或将达4490亿欧元
据相关调查数据显示,由于云服务采用普及率的提高,2020年累计总收入预计达到4490亿欧元,达到欧盟28个成员国的国内生产总值. 根据在2014年12月到2016年4月间进行的调查报告显示,2015年 ...
- UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset
UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...
- 训练指南 UVALive - 3713 (2-SAT)
layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...
- 逆序数 UVALive 6508 Permutation Graphs
题目传送门 1 /* 2 题意:给了两行的数字,相同的数字连线,问中间交点的个数 3 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 4 用归并排序或线段树求 ...
- Infinite Fraction Path UVALive - 8207
Infinite Fraction Path UVALive - 8207 题意: 给你n个数,每个数在0到9之间,每个数的下标一次是0~n-1,然后他所能走到的数为(i^2+1)%n,i为他本身的下 ...
- F - Heron and His Triangle UVALive - 8206
F - Heron and His Triangle UVALive - 8206 题意: 给你应该n,然后求一个最小的t,问长度为t-1,t,t+1所组成的三角形的面积为整数,t>=n 题解: ...
- Tree UVALive - 8212
Tree UVALive - 8212 题意: 有n个点,k个颜色,每个点都要被染色,相同颜色之间的边算是被该颜色覆盖,问有多少边被所有颜色覆盖 题解: 题目给的是无根树,我们可以将1默认为根然后求所 ...
最新文章
- 二元函数泰勒公式例题_考研数一对二元函数的二阶泰勒公式的要求是了解,那我们要了解到什么程度呢?会出那种类型的题呢?...
- 液晶显示原理与ILI9341的使用
- C 一个非递减数组 下标从0到n 元素的取值范围为从0到n的整数 判断其中是否有重复元素
- [J2ME] Signing a midlet suite的讨论稿[Update]
- html title 不显示_第2天:HTML 结构
- angular 创建服务器_使用D3和Angular创建通用的可视化
- mysql union all 别名_mysql union 与 union all 语法及用法
- _id随机的 es_es 的数据操作
- java邮箱格式_JavaMail入门:创建纯文本、HTML格式的邮件
- dl360 g7安装linux,HPDL360G7服务器安装说明.ppt
- 讯飞输入法将深度神经网络DNN技术应用于语音识别达到业界领先水平
- HandlerThread使用
- 兔子问题or斐波那契数列
- Qt学习笔记-更高级的文本编辑器-完善第一版-gif动画
- 更新CocoaPods1.1.0碰到的问题及知识点
- 央视推荐的护眼台灯是什么牌子?教育照明灯具品牌
- dosbox编译c语言,DOSBOX的简单使用
- gridview的sort_asp.net GridView排序简单实现
- 阿里云新优惠活动,幸运券免费领取
- 学习编程需要什么基础