SMOJ 种植玉米/铺地砖 题解

news2025/3/31 6:26:32

最近练了轮廓线dp的题目

1.种植玉米

题意

农夫有一个被划分成 m m m n n n列的农田。

每个格子的数字如果是 1 1 1则表示该格子的土地是肥沃的,可以种植玉米;如果该格子的数字是 0 0 0则表示该格子不能种植玉米。

但是还有一个条件:不能出现相邻的两个格子都种植玉米的情况。

问有多少种不同的种植方式。

1 ≤ m , n ≤ 15 1\le m,n\le 15 1m,n15

思路

前一篇题解的经验告诉我们,我们同样的使用记忆化搜索实现这个轮廓线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 1c1位表示 r r r 1 ∼ c − 1 1\sim c-1 1c1的状态, s s s c c c到最后一位表示 r − 1 r-1 r1行的 c c c到最后一位的状态(因为 r − 1 r-1 r1行的 1 ∼ c − 1 1\sim c-1 1c1位对当前没有影响)。

钦定一下下面代码用到的状态:

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 c1位(左侧)状态为 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 1h,w16

答案对 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 1c1位表示 r r r 1 ∼ c − 1 1\sim c-1 1c1的状态, s s s c c c到最后一位表示 r − 1 r-1 r1行的 c c c到最后一位的状态(因为 r − 1 r-1 r1行的 1 ∼ c − 1 1\sim c-1 1c1位对当前没有影响)。

当前格是 ( 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;
}

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

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

相关文章

沃丰科技大模型标杆案例 | 索尼大模型智能营销机器人建设实践

AI大模型发展日新月异&#xff0c;国内外主流大模型每月必会升级。海外AI大模型市场由美国主导&#xff0c; 各模型已形成“多强竞合”的局面。中国积极响应全球大模型技术的发展趋势&#xff0c;高校、研究院所等科研机构、互联网企业&#xff0c;人工智能企业均不同程度地投入…

【Java项目】基于SpringBoot的【休闲娱乐代理售票系统】

【Java项目】基于SpringBoot的【休闲娱乐代理售票系统】 技术简介&#xff1a;系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等&#xff0c;总体功能模块运用自顶向下的分层思想。 系统简介&#xff1a;休闲娱乐代理售票系统&#xff0c;在系统首页可以查看…

EasyRTC:开启智能硬件与全平台互动新时代

在当今数字化时代&#xff0c;实时音视频互动已成为企业与用户沟通、协作和娱乐的关键技术。无论是在线教育、视频会议、远程医疗还是互动直播&#xff0c;流畅、高效的互动体验都是成功的关键。然而&#xff0c;实现跨平台、低延迟且功能丰富的音视频互动并非易事——直到 Eas…

禁止WPS强制打开PDF文件

原文网址&#xff1a;禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR&#xff0c;输入&#xff1a;regedit&#xff0c;回车。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

DeepSeek 云原生分布式部署的深度实践与疑难解析—— 从零到生产级落地的全链路避坑指南

一、云原生环境下的部署架构设计 1.1 典型架构拓扑 关键点&#xff1a;Master 节点需保证强一致性&#xff0c;Worker 节点需支持异构硬件调度。 1.2 配置模板陷阱 问题现象&#xff1a; 直接使用官方 Helm Chart 部署后出现 Pod 频繁重启 日志报错 ResourceQuota exceeded…

【笑着写算法系列】位运算

前言 位运算可以说是一个算法里面比较神奇的算法&#xff0c;利用这个算法可以用极少的资源来完成一些运算&#xff0c;主要得力于位运算的一些特殊的性质。 在进行题目练习之前我们先了解一下有关位运算的一些主要作用: 确定一个数n的第x位二进制位是0还是1,我们可以使用(&a…

【CCF CSP-J 2020】优秀的拆分

前言 请勿抄袭。 思路 二进制操作题。 首先&#xff0c;根据题意&#xff0c;如果给定的 n n n 是奇数那么直接输出 -1。 然后&#xff0c;可以发现题目是要求我们把 n n n 拆成 2 a 1 2 a 2 . . . 2 a x 2^{a_1}2^{a_2}...2^{a_x} 2a1​2a2​...2ax​ 这种形式。 看…

chrome V3插件开发,调用 chrome.action.setIcon,提示路径找不到

问题描述&#xff1a; chrome V3插件开发&#xff0c;调用 chrome.action.setIcon&#xff0c;提示路径找不到。 解决问题过程&#xff1a; chrome插件v2版本中设置插件图标接口是&#xff1a;chrome.browserAction.setIcon。v3 版本种接口是 chrome.action.setIcon。同样的…

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2)

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(2) 我们上次已经了解了Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 今天&#xff0c;我们继续快速了解下最近比…

多模态机器学习火热idea汇总!

想发论文&#xff0c;却完全没头绪&#xff1f;那我非常推荐你关注这个潜力方向&#xff1a;多模态机器学习&#xff01; 它能够把不同模态的数据&#xff0c;映射到统一的高维向量空间&#xff0c;实现模态间的语义对齐&#xff0c;从而促进模态间的相互理解&#xff0c;提高…

【MySQL】简单掌握数据类型与表操作,让数据库性能飞跃

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f333;一、数据类型 &#x1f343;1.数值类型 &#x1f342;整型类型 &#x1f342;浮点型类型 &#x1f342;定点数类型 &#x1f343;2.字符串类型 3.&am…

学习数据结构(11)二叉树(堆)下

1.堆的概念 如果有⼀个集合 K {k0&#xff0c;k1&#xff0c;k2&#xff0c;...&#xff0c;k(n-1)} &#xff0c;把它的所有元素按完全二叉树的形式存储在一个一维数组中&#xff0c;并满足&#xff1a;K(i)<2*i1且K(i)<2*i2&#xff08;K(i)>2*i1且K(i)>2*i2&a…

计算机毕业设计Python房价预测 房源推荐系统 房源分析可视化(源码+LW文档+PPT+详细讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

JDBC 入门:从基础到实战

一、JDBC 概述 JDBC&#xff0c;即 Java DataBase Connectivity&#xff0c;是 Java 用于连接数据库的技术&#xff0c;旨在通过 Java 代码操作数据库。它是一套接口规范&#xff0c;其实现类由各数据库生产商提供。掌握 JDBC 接口和方法&#xff0c;就能操作不同数据库。而驱…

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…

VsCode美化 Json

1.扩展中输入:pretty json 2. &#xff08;CtrlA&#xff09;选择Json文本 示例:{ "name" : "runoob" , "alexa" :10000, "site" : null , "sites" :[ "Google" , "Runoob" , "T…

ssm121基于ssm的开放式教学评价管理系统+vue(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

《深度学习》——ResNet网络

文章目录 ResNet网络ResNet网络实例导入所需库下载训练数据和测试数据设置每个批次的样本个数判断是否使用GPU定义残差模块定义ResNet网络模型导入GPU定义训练函数定义测试函数创建损失函数和优化器训练测试数据结果 ResNet网络 ResNet&#xff08;Residual Network&#xff0…

【Windows软件 - HeidiSQL】导出数据库

HeidSQL导出数据库 软件信息 具体操作 示例文件 选项分析 选项&#xff08;1&#xff09; 结果&#xff08;1&#xff09; -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: …

【达梦数据库】dblink连接[SqlServer/Mysql]报错处理

目录 背景问题1&#xff1a;无法测试以ODBC数据源方式访问的外部链接!问题分析&原因解决方法 问题2&#xff1a;DBLINK连接丢失问题分析&原因解决方法 问题3&#xff1a;DBIINK远程服务器获取对象[xxx]失败,错误洋情[[FreeTDS][SQL Server]Could not find stored proce…