SMOJ 种植玉米/铺地砖 题解
最近练了轮廓线dp的题目
1.种植玉米
题意
农夫有一个被划分成 m m m行 n n n列的农田。
每个格子的数字如果是 1 1 1则表示该格子的土地是肥沃的,可以种植玉米;如果该格子的数字是 0 0 0则表示该格子不能种植玉米。
但是还有一个条件:不能出现相邻的两个格子都种植玉米的情况。
问有多少种不同的种植方式。
1 ≤ m , n ≤ 15 1\le m,n\le 15 1≤m,n≤15
思路
前一篇题解的经验告诉我们,我们同样的使用记忆化搜索实现这个轮廓线dp。
但是在这一题中,如果我们一行一行从左向右填,我们既要考虑正上方的状态也要考虑左边的状态。
于是我们就要对状态 s s s进行一些改动:设当前遍历到了 r r r行 c c c列的格子, 0 0 0不填 1 1 1填。 s s s的 1 ∼ c − 1 1\sim c-1 1∼c−1位表示 r r r行 1 ∼ c − 1 1\sim c-1 1∼c−1的状态, s s s的 c c c到最后一位表示 r − 1 r-1 r−1行的 c c c到最后一位的状态(因为 r − 1 r-1 r−1行的 1 ∼ c − 1 1\sim c-1 1∼c−1位对当前没有影响)。
钦定一下下面代码用到的状态:
int t=(1<<(c-1)),pt=(1<<(c-1-1));//上、左
如果不能种,强制修改当前位为 0 0 0并转移。
if(!a[r][c])//不能种
{if(s&t)f[r][c][s]=dfs(r,c+1,s^t);else f[r][c][s]=dfs(r,c+1,s);return f[r][c][s];
}
如果能种,那么既可以种,也可以不种,那么先看不种:其实和刚刚一样的,同样强制修改为 0 0 0并转移,不过不能直接return,因为要累加到当前格子的贡献去。
如果种的话,就要满足 c c c位(上方)位 0 0 0,且 s s s的 c − 1 c-1 c−1位(左侧)状态为 0 0 0,或者说本身就在第一列。此时需要把本位 c c c的状态强制修改为 1 1 1。
int z=0,bz=0;
//不种
if(s&t)bz=dfs(r,c+1,s^t);
else bz=dfs(r,c+1,s);
//种
if(!(s&t)&&(!(s&pt)||c==1))z=dfs(r,c+1,s|t);
代码
#include<bits/stdc++.h>
using namespace std;
const int N=16,M=16,inf=0x3f3f3f3f,mod=1e8;
int n,m,a[N][M];
int f[N][M][1<<(M-1)+3];
int dfs(int r,int c,int s)//状态s:r行1~c-1位状态,r-1行c~m位状态
{if(r>n)return 1;if(c>m)return dfs(r+1,1,s);if(!(f[r][c][s]>=inf))return f[r][c][s];int t=(1<<(c-1)),pt=(1<<(c-1-1));//上、左 if(!a[r][c])//不能种 {if(s&t)f[r][c][s]=dfs(r,c+1,s^t);else f[r][c][s]=dfs(r,c+1,s);return f[r][c][s];}int z=0,bz=0;//不种if(s&t)bz=dfs(r,c+1,s^t);else bz=dfs(r,c+1,s);//种if(!(s&t)&&(!(s&pt)||c==1))z=dfs(r,c+1,s|t);f[r][c][s]=(bz+z)%mod;return f[r][c][s];
}
int main()
{scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];memset(f,inf,sizeof(f));printf("%lld",dfs(1,1,0));return 0;
}
2.铺地砖
题意

1 ≤ h , w ≤ 16 1\le h,w\le 16 1≤h,w≤16
答案对 1 0 9 + 7 10^9+7 109+7取模。
思路
把影响修改一下,变成1x2或者2x1的地砖即可。
对于状态 s s s, 0 0 0表示没填 1 1 1表示填了, s s s的 1 ∼ c − 1 1\sim c-1 1∼c−1位表示 r r r行 1 ∼ c − 1 1\sim c-1 1∼c−1的状态, s s s的 c c c到最后一位表示 r − 1 r-1 r−1行的 c c c到最后一位的状态(因为 r − 1 r-1 r−1行的 1 ∼ c − 1 1\sim c-1 1∼c−1位对当前没有影响)。
当前格是 ( r , c ) (r,c) (r,c),钦定一下状态
int t=(1<<(c-1)),nt=(1<<(c+1-1));//上、右
如果填了就要把当前位强制修改为 0 0 0
if(s&t)//利用已有的竖线or横线
{f[r][c][s]=dfs(r,c+1,s^t);return f[r][c][s];
}
否则填地砖,打竖需要 r < n r<n r<n,打横需要下一个没填且 c < m c<m c<m。
int shu=0,heng=0;if(r<n)shu=dfs(r,c+1,s|t);if(c<m&&!(s&nt))heng=dfs(r,c+1,s|nt);
代码
#include<bits/stdc++.h>
using namespace std;
const int N=17,M=17,inf=0x3f3f3f3f,mod=1e9+7;
int n,m;
int f[N][M][1<<M];
int dfs(int r,int c,int s)//状态s:r行1~c-1位状态,r-1行c~m位状态
//0表示没填,1表示填过
{if(r>n)return 1;if(c>m)return dfs(r+1,1,s);if(!(f[r][c][s]>=inf))return f[r][c][s];int t=(1<<(c-1)),nt=(1<<(c+1-1));if(s&t)//利用已有的竖线or横线 {f[r][c][s]=dfs(r,c+1,s^t);return f[r][c][s];}int shu=0,heng=0;if(r<n)shu=dfs(r,c+1,s|t);if(c<m&&!(s&nt))heng=dfs(r,c+1,s|nt);f[r][c][s]=(shu+heng)%mod;return f[r][c][s];
}
int main()
{scanf("%d%d",&n,&m);if((n*m)&1){puts("0");return 0;}memset(f,inf,sizeof(f));printf("%lld",dfs(1,1,0));return 0;
}
相关文章:
SMOJ 种植玉米/铺地砖 题解
最近练了轮廓线dp的题目 1.种植玉米 题意 农夫有一个被划分成 m m m行 n n n列的农田。 每个格子的数字如果是 1 1 1则表示该格子的土地是肥沃的,可以种植玉米;如果该格子的数字是 0 0 0则表示该格子不能种植玉米。 但是还有一个条件:不…...
沃丰科技大模型标杆案例 | 索尼大模型智能营销机器人建设实践
AI大模型发展日新月异,国内外主流大模型每月必会升级。海外AI大模型市场由美国主导, 各模型已形成“多强竞合”的局面。中国积极响应全球大模型技术的发展趋势,高校、研究院所等科研机构、互联网企业,人工智能企业均不同程度地投入…...
【pytest】编写自动化测试用例命名规范README
API_autoTest 项目介绍 1. pytest命名规范 测试文件: 文件名需要以 test_ 开头或者以 _test.py 结尾。例如,test_login.py、user_management_test.py 这样的命名方式,pytest 能够自动识别并将其作为测试文件来执行其中的测试用例。 测试类…...
双亲委派机制介绍
双亲委派机制(Parent Delegation Model)是Java类加载器(Class Loader)的一种机制,用于确保Java应用程序的安全性和稳定性。 在Java中,类加载器负责将类的字节码文件加载到Java虚拟机(JV…...
fps僵尸:8.丧尸死亡
文章目录 思路死亡时关闭碰撞死亡时开启物理模拟 实现胶囊体关闭碰撞网格体开启物理模拟(两个前提)网格体开启物理碰撞网格体绑定物理资产 注解胶囊体关闭碰撞,则整个蓝图关闭碰撞 思路 死亡时关闭碰撞 死亡时开启物理模拟 实现 胶囊体关闭碰撞 网格体开启物理…...
内存泄漏是什么?
内存泄漏 概述: 程序在运行过程中,动态分配的内存未被及时释放,导致这些内存无法再次使用,最终导致系统内存耗尽,影响程序性能,甚至导致程序崩溃 原因: 未释放已分配的内存:在使用…...
Zipkin 和 SkyWalking 区别
Zipkin 和 SkyWalking 都是分布式追踪和监控工具,但它们在架构设计、功能、扩展性以及适用场景上有所不同。下面是它们的主要区别: 1. 架构和设计 Zipkin: Zipkin 是一个轻量级的分布式追踪系统,通常与 Spring Cloud Sleuth 配合…...
hive如何导出csv格式文件
方法一:使用 Hive 自带功能结合脚本处理 步骤 1:使用 hive -e 命令导出数据到文件 可以通过在命令行中使用 hive -e 执行查询语句,并将结果重定向到本地文件,不过默认是不带字段头的。 hive -e "SELECT column1, column2,…...
【Java项目】基于SpringBoot的【休闲娱乐代理售票系统】
【Java项目】基于SpringBoot的【休闲娱乐代理售票系统】 技术简介:系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等,总体功能模块运用自顶向下的分层思想。 系统简介:休闲娱乐代理售票系统,在系统首页可以查看…...
MMLU论文简介
评测语言模型的“全能性”:MMLU基准测试解析 加州大学伯克利分校、哥伦比亚大学等机构的研究团队提出一项全新的评测基准——MMLU(Massive Multitask Language Understanding)。这项测试覆盖57个学科,从基础数学到专业法律&#…...
EasyRTC:开启智能硬件与全平台互动新时代
在当今数字化时代,实时音视频互动已成为企业与用户沟通、协作和娱乐的关键技术。无论是在线教育、视频会议、远程医疗还是互动直播,流畅、高效的互动体验都是成功的关键。然而,实现跨平台、低延迟且功能丰富的音视频互动并非易事——直到 Eas…...
【数据分析】2.数据分析业务全流程
业务流程方法论:3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标:系统性地解决商业中的关键问题框架:分为三个阶段,每个阶段包含两个步骤适用场景:适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...
禁止WPS强制打开PDF文件
原文网址:禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR,输入:regedit,回车。找到:HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…...
树莓百度百科新动态:宜宾项目的深远影响与意义
在树莓集团的百度百科词条中,宜宾项目的新动态备受关注,其深远影响与意义不容忽视。 从产业发展角度来看,宜宾项目带动了当地数字产业的集聚。树莓集团在宜宾建设的多个数字产业园区,吸引了众多上下游企业入驻。形成了从芯片研发…...
mysql索引为什么用B+树不用,B树或者红黑树
MySQL 选择 B 树作为索引结构,而不是 B 树或红黑树,主要原因如下: 1. 磁盘 I/O 优化 B 树:节点存储更多键值,树的高度较低,减少了磁盘 I/O 次数,适合处理大规模数据。 B 树:虽然也…...
DeepSeek 云原生分布式部署的深度实践与疑难解析—— 从零到生产级落地的全链路避坑指南
一、云原生环境下的部署架构设计 1.1 典型架构拓扑 关键点:Master 节点需保证强一致性,Worker 节点需支持异构硬件调度。 1.2 配置模板陷阱 问题现象: 直接使用官方 Helm Chart 部署后出现 Pod 频繁重启 日志报错 ResourceQuota exceeded…...
【笑着写算法系列】位运算
前言 位运算可以说是一个算法里面比较神奇的算法,利用这个算法可以用极少的资源来完成一些运算,主要得力于位运算的一些特殊的性质。 在进行题目练习之前我们先了解一下有关位运算的一些主要作用: 确定一个数n的第x位二进制位是0还是1,我们可以使用(&a…...
【CCF CSP-J 2020】优秀的拆分
前言 请勿抄袭。 思路 二进制操作题。 首先,根据题意,如果给定的 n n n 是奇数那么直接输出 -1。 然后,可以发现题目是要求我们把 n n n 拆成 2 a 1 2 a 2 . . . 2 a x 2^{a_1}2^{a_2}...2^{a_x} 2a12a2...2ax 这种形式。 看…...
chrome V3插件开发,调用 chrome.action.setIcon,提示路径找不到
问题描述: chrome V3插件开发,调用 chrome.action.setIcon,提示路径找不到。 解决问题过程: chrome插件v2版本中设置插件图标接口是:chrome.browserAction.setIcon。v3 版本种接口是 chrome.action.setIcon。同样的…...
大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)
大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2) 我们上次已经了解了Paimon的下载及安装,并且了解了主键表的引擎以及changelog-producer的含义 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 今天,我们继续快速了解下最近比…...
多模态机器学习火热idea汇总!
想发论文,却完全没头绪?那我非常推荐你关注这个潜力方向:多模态机器学习! 它能够把不同模态的数据,映射到统一的高维向量空间,实现模态间的语义对齐,从而促进模态间的相互理解,提高…...
【MySQL】简单掌握数据类型与表操作,让数据库性能飞跃
个人主页:♡喜欢做梦 欢迎 👍点赞 ➕关注 ❤️收藏 💬评论 目录 🌳一、数据类型 🍃1.数值类型 🍂整型类型 🍂浮点型类型 🍂定点数类型 🍃2.字符串类型 3.&am…...
学习数据结构(11)二叉树(堆)下
1.堆的概念 如果有⼀个集合 K {k0,k1,k2,...,k(n-1)} ,把它的所有元素按完全二叉树的形式存储在一个一维数组中,并满足:K(i)<2*i1且K(i)<2*i2(K(i)>2*i1且K(i)>2*i2&a…...
计算机毕业设计Python房价预测 房源推荐系统 房源分析可视化(源码+LW文档+PPT+详细讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
JDBC 入门:从基础到实战
一、JDBC 概述 JDBC,即 Java DataBase Connectivity,是 Java 用于连接数据库的技术,旨在通过 Java 代码操作数据库。它是一套接口规范,其实现类由各数据库生产商提供。掌握 JDBC 接口和方法,就能操作不同数据库。而驱…...
vue中为组建添加样式的方式
在 Vue 中,可以通过多种方式为 view 添加样式,并且支持动态绑定样式。以下是几种常见的方式: 1. 内联样式 直接在模板中使用 style 属性来添加样式。 <template><div style"color: red; font-size: 14px;">这是一个…...
Linux探秘坊-------5.git
1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…...
训练与优化
训练与优化 损失函数与反向传播 损失函数能够衡量神经网络输出与目标值之间的误差,同时为反向传播提供依据,计算梯度来优化网络中的参数。 torch.nn.L1Loss 计算所有预测值与真实值之间的绝对差。参数为 reduction : none:不对…...
VsCode美化 Json
1.扩展中输入:pretty json 2. (CtrlA)选择Json文本 示例:{ "name" : "runoob" , "alexa" :10000, "site" : null , "sites" :[ "Google" , "Runoob" , "T…...
基于Spring Boot的社区居民健康管理平台的设计与实现
目录 1 绪论 1.1 研究现状 1.2 研究意义 1.3 组织结构 2 技术介绍 2.1 平台开发工具和环境 2.2 Vue介绍 2.3 Spring Boot 2.4 MyBatis 2.5 环境搭建 3 系统需求分析 3.1 可行性分析 3.2 功能需求分析 3.3 系统用例图 3.4 系统功能图 4 系统设计 4.1 系统总体描…...
