题面 : 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. 【NOIP2017练习】鏖战字符串(斜率优化DP)

    题意: 在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除.“量子态的字符串”的每个字符都有一个删除难度dif[i].“量子态的字符串”非常顽固,只能先分割成若 ...

  2. centos7 host修改

    首先要说明,hostname和hosts文件没有必然联系,有不明白的同学可以先自行查阅资料了解hostname和hosts文件的关系.这里简要说明一下. hosts文件是dns服务的前身,网络刚开始出 ...

  3. n个点中求任意两点组成斜率的最大值

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1100 首先按x坐标排序,然后相邻的三个点A,B,C 组成的三条直线必然有 ...

  4. litepal创建数据库表失败

    今天学习郭神的litepal框架遇到了一个坑,就是程序正常跑了,但是数据库和表完全没创建!!!!!!! 先核对了litepal.xml文件,确认配置正确,assets文件夹放的也正确,最后发现竟然是因 ...

  5. Ubuntu 16.04创建Swap分区或增加Swap分区容量(转)

    要在Ubuntu中要创建Swap分区主要有如下2种方式: 一.传统创建方式 一般情况下,我们都会使用dd命令来预先创建交换分区文件,然后再用/dev/zero将该文件的内容全部置零,创建时还将用到bs ...

  6. Ubuntu 16.04开机自动挂载硬盘分区(转)

    说明:如果挂载以前旧硬盘分区时不需要第2.3步! 1.查看Linux硬盘信息: sudo fdisk -l 2.格式化新硬盘(很危险,注意操作时确定硬盘分区的位置): sudo mkfs.ext4 / ...

  7. HTTPS 是如何保证安全的?

    每当我们讨论到信息安全的时候,我们最长接触到的信息加密传输的方式莫过于 HTTPS 了,当我们浏览器地址栏闪现出绿色时,就代表着这个网站支持 HTTPS 的加密信息传输方式,并且你与它的连接确实被加密 ...

  8. maven提示“编码 GBK 的不可映射字符”问题的解决

    pom.xml中加上如下代码 <properties> <!-- spring版本号 --> <spring.version>4.2.3.RELEASE</s ...

  9. java编程思想-多态

    java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是动态绑定即运行时绑定. public class test { private void ...

  10. samba add new smbpasswd & recycle

    建立新账号(XXXXX)的范列: sudo useradd XXXXX -m   #建立本机用户且home下建文件夹 sudo smbpasswd XXXXX -a   #建立samba用戶且设定密码 ...