[UVALive 4490] Help Bubu
图片加载可能有点慢,请跳过题面先看题解,谢谢
首先我们很容易注意到一件事情:\(h\) \(\epsilon\) {\(25,26,27,28,29,30,31,32\)},数一下,\(8\)个数,上状压
设状态 \(f[i][j][s][g]\) 为,处理到第 \(i\) 本书,抽掉了$ j$ 本,剩余书的状态为 \(s\) (一个二进制数),最后一本放 \(g\) 的最小步数
我们分三种情况转移:
- 第 \(i\) 本和第 \(i-1\) 本相同,则有:\(f[i][j][s][g]=min(f[i-1][j][s][g])\);
- 第 \(i\) 本和第 \(i-1\) 本不同,且抽掉第 \(i\) 本,则有:\(f[i][j+1][s][g]=min(f[i-1][j][s][g])\);
- 第 \(i\) 本和第 \(i-1\) 本不同,且不抽掉第 \(i\) 本,则有:\(f[i][j][s|(1<<(a[i]-25))][a[i]-25]=min(f[i-1][j][s][g]+1)\);
其中,\((1<<g)\leq s\),\(s\) \(\epsilon\) \(S\),\(S\) 为当前所有出现过的书的状态,\(s\) 可以通过枚举 \(S\) 的子集得到
当然,第一维可以滚一维,节省空间,也可以节省 \(memset\) 的时间
最后答案就是 \(min(f[n][j][s][g]+calc(S\) ^ \(s))\),\(calc(S\) ^ \(s)\) 为 \(S\) ^ \(s\) 中 \(1\) 的个数
//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define inf (0x3f3f3f3f)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int S,x,t;
int n,k,f[110][110][1<<8][10];il void init(){ S=0; memset(f,0x3f,sizeof(f)); }il int min(int &a,int b){return a=a<b?a:b;}
il int calc(int c){ return (!c)?0:calc(c/2)+(c%2); }il void work(){for(int i=1;i<=n;i++){scanf("%d",&x); x-=25;f[i][i-1][1<<x][x]=1;for(int j=0;j<=min(i-1,k);j++)for(int s=S;s;s=(s-1)&S)for(int g=0;(1<<g)<=s;g++)if(f[i-1][j][s][g]!=inf){int y=f[i-1][j][s][g];if(g==x) min(f[i][j][s][g],y);else{min(f[i][j+1][s][g],y);min(f[i][j][s|(1<<x)][x],y+1);}}S|=(1<<x);}int ans=inf;for(int j=0;j<=k;j++)for(int s=S;s;s=(s-1)&S)for(int g=0;(1<<g)<=s;g++)if(f[n][j][s][g]!=inf)ans=min(ans,f[n][j][s][g]+calc(S^s));printf("Case %d: %d\n\n",++t,ans);
}int main(){ while(scanf("%d%d",&n,&k)&&n){ init(); work(); } return 0; }
转载于:https://www.cnblogs.com/Hero-of-someone/p/7671242.html
[UVALive 4490] Help Bubu相关推荐
- 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默认为根然后求所 ...
最新文章
- php 实现 html转js
- Codeforces Round #540 (Div. 3) A,B,C,D2,E,F1
- ROS调用本地摄像头数据并在rviz里显示
- Codeforces 1286C/1287E Madhouse (交互题)
- 为了OFFER,我加深学习,搞懂了栈
- 《数据库SQL实战》查找所有已经分配部门的员工的last_name和first_name
- 图片适应窗口_在word中插入图片,如何避免失真模糊?实用文档建议收藏
- 今天在看慕课网的java学习路径
- 360浏览器打不开网页_苹果移动端、PC端safari浏览器打不开网页的解决方案!
- 网易云api及 asrsea 加密参数文档
- 浏览器设备信息UserAgent查询
- Extjs ComboBox常用的配置
- C题:无线充电电动小车(本科)--2018年TI杯大学生电子设计竞赛
- macOS远程管理linux,MacOS远程控制工具
- 【题解】[LuoguP3503]「BZOJ2086」[POI2010] Blocks
- Linux下文件压缩、打包,看这一篇就够了
- 台式低速常温离心机S400操作规程
- Web前端基础体验学习过程1 HTML篇
- python中常用于输出信息的语句函数是print括号_第十四课我们研究一下常用的print()函数,翻看了一下Python宝典...
- mysql血缘 表级血缘 字段级血缘GUDU GSP,JSQL PARSER,ANTLR MYSQL,DRUID