AcWing 327. 玉米田(状态压缩DP)

news2024/9/23 17:24:57

AcWing 327. 玉米田(状态压缩DP)

  • 一、问题
  • 二、分析
    • 1、思路
    • 2、状态表示
    • 3、状态转移
    • 4、循环设计
    • 5、初末状态
  • 三、代码

一、问题

在这里插入图片描述

二、分析

1、思路

这道题与之前所讲解的AcWing 1064. 小国王(状态压缩DP)非常相似,所以如果大家没有思路的话,可以去看看之前的这篇文章,然后再回来做这道题。

这道题的思路也是一样,一行一行的看。至于这种思路为什么是正确的,作者在AcWing 1064. 小国王(状态压缩DP)里面进行过详细地讲解,这里不做过多的介绍了。

i i i行能种植玉米的方式取决于第 i − 1 i-1 i1行。我们可以利用这个方式来书写转移方程。

这一题的变化在于题目中对土地也有了限制,图中写着1的是能种植,写着0的是不能种植。

我们先来分析一下合法状态需要满足的条件:

我们先不考虑土地的限制。
在这里插入图片描述

现在我们考虑一下土地,土地限制的是本行。按照题目所说1是能种植,0是不能种植。但是这样不太好进行后续的判断,现在我们每一行的土地所代表的01进行取反。这样的话,原来是1的土地现在是0,原来是0的土地现在是1。所以在原来是1的地方种植,即在取反后为0的地方种植。这样的话,就会呈现出下面的现象:对于取反后的土地,0能种植,1不能种植。这样的话,就必定满足我们的种植方案和本行的土地情况做&运算得0。

因此,可以将合法状态总结为下面的方式:
在这里插入图片描述

2、状态表示

f [ i ] [ s ] f[i][s] f[i][s]表示在前i行里面种植玉米,并且第i行的状态是s时,所有的种植方案。

3、状态转移

f [ i ] [ s ] = ∑ f [ i − 1 ] [ s s ] f[i][s]=\sum f[i-1][ss] f[i][s]=f[i1][ss]

4、循环设计

最外层肯定是循环i,第二层就循环我们的状态ss,然后再去枚举第i-1层的可能合法状态进行判断。
这样是3层循环,那么最大的计算次数是: 12 ∗ 2 1 2 ∗ 2 1 2 12*2^12*2^12 12212212。由于我们会对状态进行预处理,仅保留二进制表示下没有相邻个1的状态,所以运算次数肯定比这个小。就算是这个运算次数,也没有到达上限,所以我们的方法是不超时的。

5、初末状态

f[0][0]=1即可。即再前0行种植,且种了0个的方案数是1。

最后的状态是f[n+1][0]。

即再前n+1行中种玉米,但是第n+1行不种玉米的方案数。

三、代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=15,S=1<<12,mod=1e8;
long long g[N],f[N][S];
vector<int>state;
int n,m;
bool check(int x)
{
    for(int i=0;i+1<m;i++)
    {
        if((x>>i&1)&&(x>>(i+1)&1))return false;
    }
    return true;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<m;j++)
        {
            int x;
            cin>>x;
            g[i]+=(!x)*1<<j;
        }
    }
    for(int i=0;i<1<<m;i++)
    {
        if(check(i))state.push_back(i);
    }
    f[0][0]=1;
    for(int i=1;i<=n+1;i++)
    {
        for(int s=0;s<state.size();s++)
        {
            if(g[i]&state[s])continue;
            for(int ss=0;ss<state.size();ss++)
            {
                if(g[i-1]&state[ss])continue;
                if((state[s]&state[ss])==0)
                    f[i][state[s]]=(f[i][state[s]]+f[i-1][state[ss]])%mod;
            }
        }
    }
    cout<<f[n+1][0]<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM uboot 的源码目录分析

一、uboot的源码目录分析1 1、九鼎官方 uboot 和三星原版 uboot 对比 (1) 以九鼎官方的 uboot 为蓝本来学习的&#xff0c;以三星官方的这份为对照。 (2) 不同版本的 uboot 或者同一版本不同人移植的 uboot&#xff0c;可能目录结构和文件内容都有所不同。将来大家懂了后也可…

剑指 Offer 第8天

目录 剑指 Offer 10- I. 斐波那契数列 剑指 Offer 10- II. 青蛙跳台阶问题 剑指 Offer 63. 股票的最大利润 剑指 Offer 10- I. 斐波那契数列 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#xf…

java并发编程面试题目及答案2(持续更新)

22、利用原子类手写 CAS 无锁 /** * 利用 cas 手写 锁 */ public class AtomicTryLock {private AtomicLong atomicLongnew AtomicLong(0);private Thread lockCurrentThread; /** * 1 表示锁已经被获取 0 表示锁没有获取 利用 cas 将 0 改为 1 成功则表示获取锁 * return */…

Linux find 命令

Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。语法find path -option [ -pr…

微服务-高并发-思路

一、为什么选择Go语言 Go 语言相对其它语言具有几点天然的优势&#xff1a; 语法简单&#xff0c;上手快性能高&#xff0c;编译快&#xff0c;开发效率也不低原生支持并发&#xff0c;协程模型是非常优秀的服务端模型&#xff0c;同时也适合网络调用部署方便&#xff0c;编译…

C语言深度解剖-关键字(3)

目录 1.关键字 sizeof C语言基本数据类型 认识 sizeof sizeof 相关扩展&#xff1a; 2. signed 与 unsigned 关键字 整形在内存的存储 如何快速转换二进制 写在最后&#xff1a; 1.关键字 sizeof C语言基本数据类型 以下是C语言基本的数据类型&#xff1a; 定义变量的…

Leetcode:37. 解数独(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列…

分布式链路追踪SkyWalking进阶实战之RPC上报和WebHook通知(三)

目录 1.自定义SkyWalking链路追踪配置 1.1 什么是TraceId 1.2 使用的背景 1.3 编码 2.SkyWalking-RocketBot性能剖析 3.SkyWalking链路追踪-日志和RPC上报实战 4.源码部署 Apache SkyWalking 5.SkyWalking链路追踪-告警模块和WebHook通知《上》 6.SkyWalking链路追踪-…

对技术类的管理和绩效的一些想法

大家好&#xff1a; 我是烤鸭。看完春晚小品的心情(除了神马组合)&#xff0c;就跟下面这哥们一样&#xff0c;尬的抠脚。再加上初一跟家人出去一趟&#xff0c;消费是真的复苏了&#xff0c;哪哪都排队。本来还想去洗温泉&#xff0c;给商家打电话一直占线…就能想象有多少人了…

7. 初步认识线程同步

前言&#xff1a;一旦接触到多线程编程&#xff0c;那么线程之间的同步就显得非常重要了。c/c#/java等高级语言都有自己的线程库&#xff0c;当然也提供了线程同步的API接口。打个比方&#xff0c;在C/QT中&#xff0c;线程的同步有以下几种方式&#xff1a;互斥锁、信号量、条…

2、SPSS的基本知识

目录 一、SPSS软件的安装和启动 二、SPSS的基本操作环境 &#xff08;1&#xff09;数据编辑窗口&#xff08;主程序窗口&#xff09; &#xff08;2&#xff09;SPSS结果输出窗口 三、SPSS软件的退出 四、SPSS软件的三种基本使用方式 五、SPSS数据的结构和定义方法 1.…

单链表——简单的增删查改

前言&#xff1a;上次介绍了顺序表&#xff0c;这次我要分享对单链表的一些简单理解&#xff0c;主要框架与上次大致相同&#xff0c;内容主要是单链表的增删查改&#xff0c;适用于初学者&#xff0c;之后会继续更新一些更深入的内容。同时&#xff0c;这也仅仅是我个人对所学…

不完全微分PID控制算法及仿真

在 PID控制中&#xff0c;微分信号的引入可改善系统的动态特性&#xff0c;但也易引进高频干扰&#xff0c;在误差扰动突变时尤其显出微分项的不足。若在控制算法中加入低通滤波器&#xff0c;则可使系统性能得到改善。克服上述缺点的方法之一是在 PID算法中加入一个一阶惯性环…

pdf如何合并,用这个方法又快又好使

我们在整理文档的时候经常被要求最后提交的得是PDF&#xff0c;所以有时候手头上的文档有多份&#xff0c;但最后还得整合成一份PDF才行。合并PDF后我们才可以进行后续的操作&#xff0c;所以学会如何快速合并PDF很重要。要把多个文档整合到一起&#xff0c;借助下面这些工具就…

一文带你了解学习python的用处及好处,建议收藏

目录 学习Python能做什么&#xff1f; Python的用途有哪些 普通人学习python有什么好处 用处&#xff0c;很重要的呢 今天这一讲很关键&#xff0c;如果你都不知道python的好处&#xff0c;以及python的用处&#xff0c;那你python就算是白学了 学习Python能做什么&#xf…

【目标检测】------rcnn、fastrcnn、fasterrcnn

RCNN流程图 sppnet流程图 fastRcnn fasterrcnn网络 RPN&#xff08;Region Proposal Network&#xff09;是Faster-RCNN网络用于提取预选框&#xff08;也就是RCNN中使用selective search算法进行Region Proposal的部分&#xff09;&#xff0c;我们知道RCNN及Fast-RCNN中一个…

【Maven】属性管理

1. 属性 问题导入 定义属性有什么好处&#xff1f; 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version> </prop…

第二章——CSS基础选择器,标签选择器,类选择器, id 选择器,通配符选择器

文章目录2.1 CSS选择器的作用2.2 CSS选择器分类2.3 CSS 基础选择器分类2.4 标签选择器2.5 类选择器2.5.1 多类名选择2.6 id选择器2.7 id选择器与类选择器的区别‘2.8 通配符选择器2.9 选择器对比2.1 CSS选择器的作用 选择器(选择符)就是根据不同需求把不同的标签选出来这就是选…

python图像处理(直方图增强)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面几篇文章谈到了对图像的处理,但是它们大多数都是对图像像素进行一些时空的转换,本身像素的内容并没有发生转变。比如旋转,镜像、移动、放大、缩小等等,像素还是这些像素,只…

Pytorch基础知识

Pytorch 基础知识 1.1 张量的概念 在PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;属于一种数据结构&#xff0c;它可以使一个标量、一个向量、一个矩阵&#xff0c;甚至是更维度的数组。类似于numpy中的数组 (ndarray),并且它们是可以相互转化的&#xff0c;在P…