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

news/2024/7/7 20:28:42

传送门

Solution

搜索加Hash记录状态,记忆化搜索,需要注意顺序无关答案

Code

//By Menteur_Hxy
#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define Re register
#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
#define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i++)
using namespace std;
typedef long long LL;

inline int read() {
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
    while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    return x*f;
}

const int N=10,bas=137,MOD=1e9+7;
int n;
LL ans;
int p[4]={3,1,0,0};
int da[N],nw[N],b[N];

map<LL,int> M;

LL Hash(int x) {
    LL res=x;
    Fo(i,x,n) b[i]=da[i]-nw[i]; sort(&b[x],&b[n]);
    Fo(i,x,n) res=(res*bas%MOD+b[i])%MOD;
    return res;
}

LL dfs(int x,int y) {
    if(nw[x]>da[x]||nw[y]>da[y]) return 0;
    if(da[x]-nw[x]>(y-x)*3) return 0;
    if(x==n) return 1;
    LL res=0;
    if(y==x+1) {
        int d=da[x]-nw[x];
        if(d==2||d>3) return 0;
        nw[x]+=d,nw[y]+=p[d];
        LL tmp=Hash(x+1);
        if(M.count(tmp)) res=M[tmp];
        else res=M[tmp]=dfs(x+1,n);
        nw[x]-=d,nw[y]-=p[d];
        return res;
    }
    if(da[x]-nw[x]>=3) {nw[x]+=3;res+=dfs(x,y-1);nw[x]-=3;}
    if(da[x]>nw[x]&&da[y]>nw[y]) {nw[x]++;nw[y]++;res+=dfs(x,y-1);nw[x]--;nw[y]--;}
    if(da[y]-nw[y]>=3) {nw[y]+=3;res+=dfs(x,y-1);nw[y]-=3;}
    return res;
}

int main() {
    n=read();
    Fo(i,1,n) da[i]=read();
    sort(da+1,da+1+n);
    ans=dfs(1,n);
    printf("%lld",ans);
    return 0;
}

转载于:https://www.cnblogs.com/Menteur-Hxy/p/9763113.html


http://www.niftyadmin.cn/n/4557065.html

相关文章

谢谢 能把它的播放地址给我吗 c.k有一首叫《只想唱歌给你听》知道不

id2134871 还有的在一些小网站才能找的到反正在百度上是找不着的 她的歌都没传到正规的网站上去 ~http://218.75.172.156/05/BD/05821AE1623D9ED44068774454E26E8CADA16FBD.mp3这个就是《只想唱歌给你听》它的播放地址 ||| 去酷狗可以找的吧http://www.kugou.com/plist/playbil…

支持向量机——机器学习(周志华)

支持向量机 间隔与支持向量 给定训练样本集D{(x1,y1),(x2,y2),...,(xm,ym)},yi∈{−1,1}D \{(\bm{x_1},y_1), (\bm{x_2},y_2),..., (\bm{x_m},y_m)\}, y_i \in \{-1, 1\}D{(x1​,y1​),(x2​,y2​),...,(xm​,ym​)},yi​∈{−1,1}&#xff0c;分类学习最基本得想法就是基于训…

hyperledger-fabric/qemu/kvm/virtual-manager -------vagrant-virtual-box

天我也遇到了这个问题&#xff0c;原因是你的 vagrant 版本跟你的 virtualbox 版本不匹配&#xff0c;解决的方法是&#xff0c;更换 virtualbox 的版本。我的 vagrant 版本是 1.8.4 &#xff0c;virtualbox 的版本是 5.1.2&#xff0c;在 vagrant up 的时候就会提示你说的错误…

谁能提供一些好的C++编程项目

可以开发一套人事管理系统

【颜纠日记】开源Github索引六大方法,开启专业学术搜索,Github搜索语法分享

长期更新预告&#xff1a; 生活经验&#xff0c;就业理财&#xff0c;操作系统&#xff0c; 学术查询&#xff0c;媒体剪辑 学术查询&#xff1a;学术查询&#xff1a;学术&#xff0c;笔记工具&#xff0c;工具搭配&#xff0c;授人以鱼不如授人以渔&#xff0c;搜索底层规则…

c#中怎样实现无页面刷新

page"pages; xmlhttp.open("GET" 微软有整套的框架 主页面通过javascript访问iframe中的数据现在来说的话推荐你使用ajax技术 iframe获取数据后 打开一个大小为0的iframe 使用javascript进行前段操作3.点击获取数据时 就可以了 ||| 有3种办法&#xff1a;1.使用…

(3)pyspark----dataframe观察

1、读取&#xff1a; sparkDF spark.read.csv(path)sparkDF spark.read.text(path)2、打印&#xff1a; sparkDF.show()【这是pandas中没有的】&#xff1a;打印内容 sparkDF.head()&#xff1a;打印前面的内容 sparkDF.describe()&#xff1a;统计信息 sparkDF.printSchema(…

【颜纠日记】WIN10无法完成操作,因为文件包含病毒或潜在的垃圾软件,实操完美解决

长期更新预告&#xff1a; 生活经验&#xff0c;就业理财&#xff0c;操作系统&#xff0c; 学术查询&#xff0c;媒体剪辑 操作系统&#xff1a;win,mac,android,ios,linux,虚拟机,vps. 信息过滤器重要性 ---颜纠日记 解决误杀 第一种方法 1.单击左下角windows图标然后找到…