传送门

三进制状压感觉有点难写啊。

不过这题状态转移方程挺简单的。

就直接f[i][j]表示前i行第i行状态为j时的选法总数,分情况转移就行了。

代码:

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000
#define N 10005
using namespace std;
int n,m,K,ban,ans=0,sta[1005],tot=0,stat,f[N][1005],bit[6],pos;
inline bool check(int x){
    int tmp=0x3f;
    for(int i=1;i<=m;++i){
        if(tmp==x%3)return false;
        tmp=x%3,x/=3;
    }
    return true;
}
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline bool judge(int a,int b){
    for(int i=1;i<=m;++i){
        if(a%3==b%3)return false;
        a/=3,b/=3;
    }
    return true;
}
int main(){
    n=read(),m=read(),K=read(),stat=1;
    for(int i=1;i<=m;++i)stat*=3;
    for(int i=0;i<stat;++i)if(check(i))sta[++tot]=i;
    for(int i=1;i<=m;++i)ban=ban*3+read()-1;
    for(int i=1;i<=tot;++i)if(ban==sta[i]){pos=i;break;}
    if(!pos){puts("0");return 0;}
    for(int i=1;i<=n;++i){
        if(i==K){
            if(i==1)f[i][pos]=1;
            else for(int j=1;j<=tot;++j)if(judge(sta[pos],sta[j]))
                (f[i][pos]+=f[i-1][j])%=mod;
        }
        else for(int j=1;j<=tot;++j){
            if(i==1)f[i][j]=1;
            else for(int k=1;k<=tot;++k)if(judge(sta[j],sta[k]))
                (f[i][j]+=f[i-1][k])%=mod;
        }
    }
    for(int i=1;i<=tot;++i)(ans+=f[n][i])%=mod;
    cout<<ans;
    return 0;
}

2018.09.10 loj#10172. 涂抹果酱(状压dp)的更多相关文章

  1. loj#10172 涂抹果酱 (状压DP)

    题目: #10172. 「一本通 5.4 练习 1」涂抹果酱 解析: 三进制的状压DP 经过简单的打表发现,在\(m=5\)时最多有\(48\)种合法状态 然后就向二进制一样枚举当前状态和上一层的状态 ...

  2. 2018.09.22 牧场的安排(状压dp)

    描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些 ...

  3. 2018.09.08 poj1185 炮兵阵地(状压dp)

    传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...

  4. 2018.09.08 NOIP模拟 division(状压dp)

    这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...

  5. 2018.10.24 bzoj2064: 分裂(状压dp)

    传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...

  6. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  7. 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】

    题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...

  8. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

  9. noi省选 [九省联考2018]一双木棋题解(状压dp)

    比浙江简单多了........ 题目转送:https://www.luogu.org/problemnew/show/P4363 分析: 我们注意到n和m都很小,考虑一下状压dp. 显然,棋子摆成的形 ...

随机推荐

  1. 1.java生成随机不重复10位字符串

    package org.changneng.util; import java.util.Random; public class A { public static void main(String ...

  2. Ping ip能ping通,ping计算机名ping不通,网络共享不能访问

    名称 协议 端口 NetBIOS Name Service UDP 137 NetBIOS Datagram Service UDP 138 NetBIOS Session Service TCP 1 ...

  3. 什么是jar,什么是war,他们两个的区别

    jar: jar包是java普通工程打的包. 里面只有编译后的class文件和一些部署文件. jar相当于把类和一些相关的资源封装到一个包中,便于程序引用. war: war包是javaweb工程打的 ...

  4. Mongodb 折腾笔记

    简介: Mongodb 是一个由 C++ 语言编写的基于分布式文件存储的数据库,是目前最像关系型数据库的非关系型数据库. 下载地址:https://fastdl.mongodb.org/linux/m ...

  5. Spring Boot 菜鸟入门(持续更新)

    目录 问题一 Note 最近入了Java的坑,正在学习spring boot.记录一下遇到的问题吧. 问题一 请求参数的问题 /get/bob我想获取bob @RequestMapping(value ...

  6. MVC3 发布到IIS 7.5

    1.应用程序池采用集成模式(建议),.NET Framework版本为: .NET Framework4.0.30319. 2.确保ASP.NET MVC3已安装好,然后检查站点的处理程序映射,看是否 ...

  7. Android中decode JPG时建议使用inPreferQualityOverSpeed

    在BitmapFactory.decodeBitmap方法中,参数BitmapFactory.Options里有一项是inPreferQualityOverSpeed:设为true的话,画质更好,加载 ...

  8. LinuxI/O 性能分析

    .I/O linux 命令: ostat 监视I/O子系统 iostat [参数][时间][次数] 通过iostat方便查看CPU.网卡.tty设备.磁盘.CD-ROM 等等设备的活动情况, 负载信息 ...

  9. JPA子查询

    Subquery<A> subquery = criteriaQuery.subquery(A.class); Root<A> root1 = subquery.from(A. ...

  10. sql server 数据库学习

    http://m.blog.csdn.net/anxpp/article/details/51295020