题面 : https://www.ioi-jp.org/joi/2013/2014-yo/2014-yo-t6/2014-yo-t6.html

题解

dp + 康托展开

一看这题不知道怎么处理

只能枚举顺序来处理小笼包的价值

然后又发现这个\(d[]\)只有7

所以可以状压他们的顺序

用现学的康托展开将前7个的顺序存储起来

用\(f[i][S]\)表示到第i个小笼包,包括第i个小笼包的前7个的先后顺序是什么

然后枚举第i+1个小笼包的顺序

算下对前面的贡献和前面的对ta的贡献

暴力dp即可

时间复杂度\(O(7!*n*7)\)

可以通过此题

代码


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int M = 105 ;
const int N = 5050 ;
using namespace std ;
inline int read() {
char c = getchar() ; int x = 0 , w = 1 ;
while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }
return x*w ;
} int n ;
int v[M] , d[M] , Ans ;
int fac[9] , f[M][N] ;
int p[9] , w[9] ;
bool vis[9] ;
inline int Merge() {
int Ans = 0 ;
for(int i = 1 , ret ; i <= 7 ; i ++) {
ret = 0 ;
for(int j = i + 1 ; j <= 7 ; j ++)
if(w[i] > w[j])
++ ret ;
Ans += ret * fac[7 - i] ;
}
return Ans + 1 ;
}
inline void Split(int x) {
memset(vis , false , sizeof(vis)) ;
x -= 1;
for(int i = 1 , ret , now ; i <= 7 ; i ++) {
ret = x / fac[7 - i] ;
for(now = 1 ; now <= n ; now ++)
if(!vis[now]) {
if(!ret) break ;
ret -- ;
}
p[i] = now ;
vis[now] = true ;
x %= fac[7 - i] ;
}
}
int main() {
n = read() ;
for(int i = 1 ; i <= n ; i ++) d[i] = read() ;
for(int i = 1 ; i <= n ; i ++) v[i] = read() ;
fac[0] = 1 ;
for(int i = 1 ; i <= 7 ; i ++) fac[i] = fac[i - 1] * i ;
for(int i = 1 ; i <= n ; i ++)
for(int S = 1 ; S <= fac[7] ; S ++) {
Split(S) ;
for(int j = 1 , ret ; j <= 8 ; j ++) { // ö¾ÙµÚi+1λµÄ˳Ðò
ret = 0 ;
for(int k = 1 ; k <= 7 ; k ++)
if(p[k] < j) w[k] = p[k] ;
else w[k] = p[k] + 1 ;
w[8] = j ;
for(int k = 1 ; k <= 7 ; k ++)
if((i - (7 - k)) > 0 && w[k] < w[8] && d[i - (7 - k)] >= 8 - k)
ret += v[i - (7 - k)] ;
for(int k = 1 ; k <= 7 ; k ++)
if((i - (7 - k)) > 0 && w[k] > w[8] && d[i + 1] >= 8 - k)
ret += v[i + 1] ;
for(int k = 2 ; k <= 8 ; k ++)
if(w[k] > w[1]) w[k] -- ;
for(int k = 1 ; k <= 7 ; k ++)
w[k] = w[k + 1] ;
int x = Merge() ;
f[i + 1][x] = max(f[i + 1][x] , f[i][S] + ret) ;
}
}
for(int i = 1 ; i <= fac[7] ; i ++) Ans = max(Ans , f[n][i]) ;
printf("%d\n",Ans) ;
return 0 ;
}

[JOI2014] 小笼包的更多相关文章

  1. Qt widget--杭州小笼包

    1,QPainter::scale(double,double);第一个参数水培方向缩放 shear剪切 QPainter::rotate()旋转,旋转度数,rotate QPainter::tran ...

  2. iOS - Regex 正则表达式

    1.Regex 定义 正则表达式又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为 regex.regexp 或 RE),计算机科学的一个概念.正则表达式使用单个 ...

  3. HDU - Pseudoforest

    Description In graph theory, a pseudoforest is an undirected graph in which every connected componen ...

  4. [知识库分享系列] 二、.NET(ASP.NET)

    最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...

  5. love yy-kiss 医生出差二期

    医生出差二期,做了一半撤出去做互联网医院了 http://confluence.haodf.net/pages/viewpage.action?pageId=15801359  医生出差二期 没设置数 ...

  6. JSOI2015 分组赛记

    分组赛结束了,虽然跟我关系不大,但是去了还是学到了不少东西 day1 上午报到,在宾馆遇到大神wzy,orz 好像没有参赛证发了,于是给我发了一个[工作证],233我是工作人员了,高贵冷艳 下午是常中 ...

  7. Swift基本语法及与OC比较之二

    //MARK:-----------------控制流----------------- //MARK: 1.for - in 循环 ,不用声明Value类型 //for value in 1...6 ...

  8. 玩转kindle paperwhite: 如何越狱,安装强大外挂软件koreader

    NOTICE 1: 在更新kpvbooklet和使用最新版本的koreader(v2013.03-211)时候,会出现pdf文档无法重排的错误.亲测. 如果你是使用的最新版本koreader且出现上述 ...

  9. 20款最好的免费的IDES和编辑器

    程序员编程利器:20款最好的免费的IDES和编辑器 Posted on 2015-02-17 21:52 尛鱼 阅读(170) 评论(1) 编辑 收藏 程序员编程利器:20款最好的免费的IDEs和编辑 ...

随机推荐

  1. uva10537 最短路 倒推

    题意:知道了,最后需要的,那么就倒着最短路,推出去就可以了. 以最短路的方式来解决.

  2. 【Eclipse】eclipse安装JAVA反编译插件

    前言:在实际的开发中几乎都会使用到一些框架来辅助项目的开发工作,对于一些框架的代码我们总怀有一些好奇之心,想一探究竟,有源码当然更好了,对于有些JAR包中的代码我们就需要利用反编译工具来看一下了,下面 ...

  3. 【IntelliJ 】设置 IntelliJ IDEA 主题和字体的方法

    2 主题修改 2.1 界面主题修改 如上图所示,依次点击Files -> Settings,进入如下界面: 标注1:主题选择区: 标注2:Darcula.IntelliJ 和 Windows,三 ...

  4. Linux操作系统下IPTables配置

    filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Chain INPUT (policy ACCEPT) target pro ...

  5. Codeforces 631D Messenger【KMP】

    题意: 给定由字符串块(字符及连续出现的个数)组成的字符串t,s,求t串中有多少个s. 分析: KMP 这题唯一需要思考的地方就是如何处理字符串块.第一想到是把他们都展开然后进行KMP,可是展开后实在 ...

  6. UVA 10006_Carmichael number

    题意: N 为合数,对于任意一个在(1,N)之间的数满足 anmodn=a,则称N为Carmichael number,对于给定的N,判断是否为Carmichael number. 分析: 素数区间筛 ...

  7. KMP算法 C#实现 字符串查找简单实现

    KMP算法 的C#实现,初级版本 static void Main(string[] args) { #region 随机字符 StringBuilder sb = new StringBuilder ...

  8. Python安装与基本数据类型

    人生苦短,我选Python. Python比其他的语言来说真的简洁多了,很多时候想做的东西都有对应的模块可以导入,平时玩点小东西真心不错. 首先讲一下安装,其实没什么好讲的,点点点点点,完事. 这里的 ...

  9. 激活IDEA 2019.1

    First step: 先下载jar包JetbrainsCrack.jar,把它放到你认为合适的文件夹内, 我放在了安装目录C:\Program Files\JetBrains\IntelliJ ID ...

  10. Mybatis教程(一)

    1      Mybatis教程(一) 学习过的持久层框架:DBUtils , Hibernate Mybatis就是类似于hibernate的orm持久层框架. 为什么学Mybatis? 目前最主流 ...