P1879 [USACO06NOV]玉米田Corn Fields

题目描述

农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ N ≤ 12)\),每一格都是一块正方形的土地。\(John\)打算在牧场上的某几格里种上美味的草,供他的奶牛们享用。

遗憾的是,有些土地相当贫瘠,不能用来种草。并且,奶牛们喜欢独占一块草地的感觉,于是\(John\)不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。

\(John\)想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)

输入输出格式

输入格式:

第一行:两个整数\(M\)和\(N\),用空格隔开。

第2到第\(M+1\)行:每行包含\(N\)个用空格隔开的整数,描述了每块土地的状态。第i+1行描述了第i行的土地,所有整数均为\(0\)或\(1\),是\(1\)的话,表示这块土地足够肥沃,0则表示这块土地不适合种草。

输出格式:

一个整数,即牧场分配总方案数除以\(100,000,000\)的余数。


做的第一道状压\(DP\),总结一下。

\(dp[i][j]\)表示第\(i\)行状态\(j\)(用二进制代表每一位是否种植,例如01010,就是当前行2和4种田)

转移:\(dp[i][j]=\sum dp[i-1][k]\),其中\(k\)为上一行的合法状态。

复杂度:\(O(2^{2*m}*n*m)\)

其中,两个带2的次方的是当前行的枚举和上一行的枚举,\(n\)是行数,\(m\)是检测合法。

可能会爆,要剪一下枝。

发现每一行有很多状态其实都是不合法的,所以先\(dfs\)找到每一行对自己来说的合法状态。

code

#include <cstdio>
#include <cstring>
using namespace std;
const int N=13;
int dp[N][1<<N];
int g[N][N],n,m,cnt=0,t0[1<<N];
//第几行,第几个数字,状态,上一个数
void dfs(int line,int dep,int t,int last)
{
    if(dep==m+1)
    {
        t0[++cnt]=t;
        return;
    }
    if(g[line][dep]&&!last)
        dfs(line,dep+1,t<<1|1,1);
    dfs(line,dep+1,t<<1,0);
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&g[i][j]);
    dfs(1,1,0,0);
    for(int i=1;i<=cnt;i++)
        dp[1][t0[i]]=1;
    for(int i=2;i<=n;i++)
    {
        cnt=0;
        dfs(i,1,0,0);
        for(int j=1;j<=cnt;j++)
            for(int k=0;k<=(1<<m)-1;k++)
            {
                if(!dp[i-1][k]) continue;
                int flag=1;
                for(int q=0;q<n;q++)
                    if((t0[j]>>q)&(k>>q))
                    {
                        flag=0;
                        break;
                    }
                if(flag)
                {
                    dp[i][t0[j]]+=dp[i-1][k];
                    dp[i][t0[j]]%=100000000;
                }
            }
    }
    int ans=0;
    for(int i=1;i<=cnt;i++)
    {
        ans+=dp[n][t0[i]];
        ans%=100000000;
    }
    printf("%d\n",ans);
    return 0;
}

2018.5.10

洛谷 P1879 解题报告的更多相关文章

  1. 洛谷 P1462 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  2. 洛谷 P1069 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  3. 洛谷 P2491 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  4. 洛谷 P2587 解题报告

    P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...

  5. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  6. 洛谷 P1053 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  7. 洛谷 P1057 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  8. 洛谷 P1430 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

  9. 洛谷 P1613 解题报告

    P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...

随机推荐

  1. Python学习 - 输入和输出

    #输出 print('hello, python') print('The quick brown fox', 'jumps over', 'the lazy dog') #多个字符串,用逗号隔开,就 ...

  2. 学习pthreads,管理线程的栈

    进程的地址空间分成代码段,静态数据段,堆和栈段.线程栈的位置和大小是从它所属的进程的栈中切分出来的.每个栈必须足够大,以容纳所有对等线程的函数的执行以及它们将会调用的例程链.或许你会问为什么要进行线程 ...

  3. Android Studio 从安装到配置使用

    Android Studio是谷歌为android量身定制的IDE,在2013年谷歌大会上提出之后一直持续更新,现在已经是功能十分强劲的android开发工具,作为一个android开发者,还是早点转 ...

  4. [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Java-Filter-FilterChain-FilterConfig源码

    public interface Filter { /** * Called by the web container to indicate to a filter that it is being ...

  6. cocos2D v3.x中动作回调函数的变化

    cocos2D v3.x版本中的动作的回调函数不能再带任何参数并且不能返回任何值. 官方给出的传递参数的办法是: 选择器(selector)不能带有任何形参,选择器需要的参数必须通过ivar或prop ...

  7. HTML中的javascript交互

    在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的javasc ...

  8. Android UI之View的加载机制(二)

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/39961201,作者:skay 对于接触安卓开不到一年的自己来说,总结下view的生 ...

  9. Hbase问题

    Q: .meta.和root表是否要分裂? A: meta表和root表不会分裂,代码中有所判断. Q: 如果不分裂,那么都只有1个region? A: ... (查看代码后)A: meta和root ...

  10. SharePoint WebPart 简单的读取列表内容的web部件

    最近,自己也在学习写一些SharePoint的部件,也就是使用对象模型,下面,介绍一下自己刚刚写的小测试程序,不足之处,还请指正. 1.  新建项目 Vs2008 – 新建 – 项目 – 类库 – 输 ...