题目链接

不会搜索了。。

DFS()中两个参数,枚举每两个队伍的比赛结果(分配当前队伍的分数)。

可以发现方案数量与具体哪只球队得了多少分无关,只与当前比赛的队伍数量和得分序列的组成有关。可以记忆化搜索。

DFS()中是从某支队伍和它后面的队伍一一进行比赛 分配得分,分配完当前后将其它队伍的得分情况哈希,看是否算过;

如果没就进行下一支队伍,其实就是计算去掉当前这支队伍的方案数。

n(n<=10)支队伍分数的情况最多为(289?)1014级别,可以直接用longlong存。

这样做为什么必须要降序排?

因为前面小的\(val\)更可能变得\(<3\),从而省去后面的DFS。

//1616kb	684ms
#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod (1000000007)
typedef long long LL;
const int N=11; int n,val[N];
std::map<LL,int> sta[N];//应该是每一位开一个map?
std::map<LL,int>::iterator it; inline bool cmp(int a,int b){
return a<b;
}
LL Get_Hash(int p)
{
int tmp[N];
for(int i=p; i<=n; ++i) tmp[i]=val[i];
std::sort(tmp+p,tmp+n+1,cmp);//tmp+p!不是tmp+p+1
LL res=0;
for(int i=p; i<=n; ++i) res=res*28+tmp[i];//tmp[i] not val[i]!(这还能写错 我说怎么还T)
return res;
}
int DFS(int l,int r)
{
if(val[l]>(r-l)*3) return 0;//根据上面的剪枝,不可能合法!
if(l==r)
{
// if(val[l]) return 0;//只有把分数恰好分配完才合法!
if(l==n) return 1;
LL s=Get_Hash(l+1);
if((it=sta[l].find(s))!=sta[l].end()) return it->second;//
return sta[l][s]=DFS(l+1,n);//这不能给迭代器(sta[l].end())赋值啊
}
int res=0;
if(val[l]>=3)
{
val[l]-=3;
res+=DFS(l,r-1), res>=mod?res-=mod:0;
val[l]+=3;
}
if(val[l]&&val[r])
{
--val[l], --val[r];
res+=DFS(l,r-1), res>=mod?res-=mod:0;
++val[l], ++val[r];
}
if(val[r]>=3)
{
val[r]-=3;
res+=DFS(l,r-1), res>=mod?res-=mod:0;
val[r]+=3;
}
return res;
} int main()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d",&val[i]);
std::sort(val+1,val+1+n,cmp);
printf("%d",DFS(1,n)); return 0;
}

BZOJ.3139.[HNOI2013]比赛(搜索 Hash)的更多相关文章

  1. bzoj 3139: [Hnoi2013]比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...

  2. [luogu3230 HNOI2013] 比赛 (搜索+Hash)

    传送门 Solution 搜索加Hash记录状态,记忆化搜索,需要注意顺序无关答案 Code //By Menteur_Hxy #include <map> #include <cm ...

  3. [HNOI2013]比赛 搜索

    [HNOI2013]比赛 搜索. LG传送门 直接暴力有60,考场上写的60,结果挂成40. 考虑在暴力的同时加个记忆化,把剩下的球队数和每支球队的得分情况hash一下,每次搜到还剩\(t\)个队的时 ...

  4. [BZOJ3139][HNOI2013]比赛(搜索)

    3139: [Hnoi2013]比赛 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1439  Solved: 719[Submit][Status] ...

  5. 3139:[HNOI2013]比赛 - BZOJ

    题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...

  6. 【BZOJ】3139: [Hnoi2013]比赛

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3139 可以发现,答案之和得分的序列有关,而且和序列中每个元素的顺序无关.考虑HASH所有的 ...

  7. [HNOI2013]比赛 (用Hash实现记忆化搜索)

    [HNOI2013]比赛 题目描述 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局, ...

  8. 【BZOJ3139】[HNOI2013]比赛(搜索)

    [BZOJ3139][HNOI2013]比赛(搜索) 题面 BZOJ 洛谷 题解 双倍经验

  9. 【题解】HNOI2013比赛

    [题解][P3230 HNOI2013]比赛 将得分的序列化成样例给的那种表格,发现一行和一列是同时确定的.这个表格之前是正方形的,后来长宽都减去一,还是正方形.问题形式是递归的.这就启示我们可以把这 ...

随机推荐

  1. js判断当前页面是顶级窗口

    <script> if(top.location!=self.location){ alert("不是顶层窗口"); }else{ alert("是顶层窗口& ...

  2. bzoj千题计划263:bzoj4870: [六省联考2017]组合数问题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4870 80分暴力打的好爽 \(^o^)/~ 预处理杨辉三角 令m=n*k 要求满足m&x== ...

  3. Mac下配置环境变量重启后不生效解决(.bash_profile vs .bashrc)(bash/zsh下不加载.bashrc问题解决)

    参考上一篇文章说明:http://www.cnblogs.com/EasonJim/p/6283094.html 得知加载顺序如下: /etc/profile /etc/paths ~/.bash_p ...

  4. 【两分钟教程】如何更改Xcode项目名称

    注意:视频在最后,还少了一个步骤:将Xcode中的名字叫做<企信通>的虚拟文件夹删掉,然后重新从硬盘中添加进来,这样就彻底完成了更改Xcode项目名称的目的.

  5. XSS小游戏通关Writeup

    源码下载:https://files.cnblogs.com/files/nul1/xss%E7%BB%83%E4%B9%A0%E5%B0%8F%E6%B8%B8%E6%88%8F.zip 我也没啥可 ...

  6. 【Linux高级驱动】input子系统框架【转】

    转自:http://www.cnblogs.com/lcw/p/3802617.html [1.input子系统框架(drivers\input)] 如何得出某个驱动所遵循的框架?    1) 通过网 ...

  7. linux动态追踪神器——Strace实例介绍【转】

    Strace是Linux下一款通用的进程动态跟踪工具,用来追踪程序执行时的系统调用和所接收的信号.其应用方法如下图(部分). 首先,简单说说它的使用参数,Strace的参数包括输出参数.过滤参数.统计 ...

  8. Visual Studio 2013更新内容简介

    前言 VS2013终于发布了,虽然之前自己使用VS2010和VS2012的时间也不长,尤其是VS2012这自己刚刚也没用多久,看到VS2013发布了,自己忍不住也下载了下来,官网肯定可以下载,不过自己 ...

  9. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果

    前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...

  10. 在c#中过滤通过System.IO.Directory.GetDirectories 方法获取的是所有的子目录和文件中的系统隐藏的文件(夹)的方法

    //读取目录 下的所有非隐藏文件夹或文件 public List<FileItem> GetList(string path) { int i; string[] folders = Di ...