状压dp,D - Grid Puzzle

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

D - Grid Puzzle


二、解题报告

1、思路分析

贪心做法看不懂(为什么我赛时要跟贪心过不去啊)

这个题麻烦在这个case:2 4 4 2,我们可以清除三次2x2得到

但是我们始终有一个原则:相邻两行一定是两次操作以内完成的,不可能有3次清除2x2来清除相邻两行的存在,否则我们可以两次清行来替换

这也是为什么我一直死磕贪心,没写状压

其实状压的话就很经典了,比蒙德里安的理想要简单

我们考虑这样定义状态 f(i, j), j = 0, 1, 2, 3

f(i, 0):清除前i行,第i行清行(注意这个状态定义清行可以继承前面的2x2操作)

f(i, 1):清除前i行,第i行在1、2两个格子清空2x2(会对下一行有影响)

f(i, 2):清除前i行,第i行在3、4两个格子清空2x2(会对下一行有影响)

f(i, 3):清除前i行,第i行在1、2 | 3、4分别清空2x2(会对下一行有影响)

状态转移:

如果a[i] > 4 以及 不考虑前面2x2操作的情况下

f[i][0] = min(f[i - 1]) + 1

如果 a[i] <= 4,那么我们就要考虑2x2了:

          f[i + 1][0] =  min(f[i + 1][0], f[i][3]);
          f[i + 1][1] =  min(f[i + 1][1], f[i][2] + 1);
          f[i + 1][2] =  min(f[i + 1][2], f[i][1] + 1);
          f[i + 1][3] =  min(f[i + 1][3], f[i][0] + 2);

如果 a[i] <= 2:

          f[i + 1][0] =  min(f[i + 1][0], f[i][1]);
          f[i + 1][1] =  min(f[i + 1][1], f[i][0] + 1);

然后特判 a[i] == 0的情况,f[i][0] = min(f[i - 1])

2、复杂度

时间复杂度: O(4N)空间复杂度:O(4N)

3、代码详解

 ​
#include <bits/stdc++.h>
#define sc scanf
using i64 = long long;
using PII = std::pair<int, int>;
constexpr int inf32 = 1e9 + 7;
constexpr i64 inf64 = 1e18 + 7;void chmin(int& x, int y) {x = y < x ? y : x;
}void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) std::cin >> a[i];std::vector<std::array<int, 4>> f(n + 1, { inf32, inf32, inf32, inf32 });f[0][0] = 0;for (int i = 0; i < n; ++ i) {f[i + 1][0] = *std::min_element(f[i].begin(), f[i].end()) + 1;if (a[i] <= 4) {chmin(f[i + 1][0], f[i][3]);chmin(f[i + 1][1], f[i][2] + 1);chmin(f[i + 1][2], f[i][1] + 1);chmin(f[i + 1][3], f[i][0] + 2);}if (a[i] <= 2) {chmin(f[i + 1][0], f[i][1]);chmin(f[i + 1][1], f[i][0] + 1);}if (a[i] == 0)chmin(f[i + 1][0], *std::min_element(f[i].begin(), f[i].end()));}std::cout << *std::min_element(f[n].begin(), f[n].end()) << '\n';
}int main() {
#ifdef DEBUGfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);int _ = 1;std::cin >> _;while (_ --)solve();return 0;
}

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

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

相关文章

【NLP】Jieba中文分词

Jieba分词是一个用于中文文本分词的开源工具。它可以将一段连续的中文文本切分成一个一个的词语&#xff0c;这对于中文自然语言处理&#xff08;NLP&#xff09;任务如文本分类、情感分析、机器翻译等非常重要。Jieba分词具有以下特点&#xff1a; 支持三种分词模式&#xff1…

【机器学习】FlyFlowerSong【人工智能】资源指南

一、引言 FlyFlowerSong是一个创新的音乐合成与处理项目&#xff0c;它利用先进的机器学习算法&#xff0c;为用户提供了一个简单而有趣的音乐创作平台。作为人工智能领域的技术自媒体创作者&#xff0c;我整理了关于FlyFlowerSong的完整教程、论文复现指南以及demo项目源代码…

前端post提交一次会有两次请求?

1 问题&#xff1a;前端post只提交一次会有两次请求&#xff1f; 前端post只提交一次会有两次请求&#xff1f;如下图&#xff1a; 这里是执行了两次post提交&#xff0c;每个post都有两次&#xff08;一次是preflight以options方式&#xff0c;一次是xhr&#xff0c;原本…

安装docker-18.06报错Error: libseccomp conflicts with docker-18.06

安装dockers报错 Error: libseccomp conflicts with docker-18.06.1ce-6.amzn2.x86_64 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest 这个是libseccomp版本跟docker版本不对&#xff0c;要升级docker版…

【笔记-软考】架构演化

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-20 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 概念 架构都会经历初始设计、实际使用、修改完善和退化弃用的过程&#xff0c;其中修改完善即为架构的演化过程&#xff0c;其演化的…

STM32+USART串口(1)

GPIO口的复用功能是有对应的&#xff0c;作USART使用的话要选择对应的GPIO&#xff1b;可以参考引脚定义&#xff1b; &#xff08;1&#xff09;串口通信分为&#xff1a;串行通信和并行通信&#xff1b; &#xff08;2&#xff09;通信波特率 &#xff1a;通常用波特率&…

Yolo-World网络模型结构及原理分析(三)——RepVL-PAN

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 网络结构2. 特征融合3. 文本引导&#xff08;Text-guided&#xff09;4. 图像池化注意力&#xff08;Image-Pooling Attention&#xff09;5. 区域文本匹配&…

springboot+vue+mybatis校园热点新闻系统+PPT+论文+讲解+售后

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存储达到…

Tomcat长连接源码解析

长连接: 客户端发送Http请求至服务端&#xff0c;请求发送完之后socket连接不断开&#xff0c;可以继续接收下一个Http请求并且解析返回。接手并解析这些Http请求的时候socket连接不断开&#xff0c;这种过程被称为长连接。 需要注意的点就在于&#xff0c;在满足什么条件的情况…

如何在 Windows 上恢复丢失或删除的文件

意外删除重要文件或文档的历史与 Windows 本身一样悠久&#xff0c;这就是为什么有许多内置方法来恢复它。从深入回收站到挖掘 Microsoft 的 Windows 文件恢复实用程序&#xff0c;以下是如何在 Windows 中恢复丢失和删除的文件。 检查回收站 Windows 帮助您恢复已删除并需要再…

IO多路复用之poll、epoll和select区分

epoll和select 假设你在大学读书&#xff0c;住的宿舍楼有很多间房间&#xff0c;你的朋友要来找你。 select版宿管大妈就会带着你的朋友挨个房间去找&#xff0c;直到找到你为止。 而epoll版宿管大妈会先记下每位同学的房间号&#xff0c; 你的朋友来时&#xff0c;只需告诉你…

【Langchain大语言模型开发教程】链

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、LLMChain 2、Sequential Chains 3、Router Chain LLMChain import warnings warnings.filterwarnings(ignore) import os import pandas as pdfrom dotenv import load_dotenv, find…

德国汉堡大学、清华大学联合英国布里斯托机器人实验室的研究工作分享:基于视觉遥操作的多指机械手灵巧操作

德国汉堡大学&#xff08;张建伟院士团队&#xff09;、清华大学&#xff08;孙富春教授和方斌&#xff09;联合英国布里斯托机器人实验室等单位在基于视觉信息遥操作的多指机械手灵巧操作研究方面取得进展。该工作得到了德国科学基金会&#xff08;DFG&#xff09;与中国国家自…

Git分支管理基本原理

原文全文详见个人博客&#xff1a; Git分支管理基本原理上文已讨论过svn分支管理的基本原理&#xff0c;本文将继续探讨Git分支管理的基本原理&#xff0c;以便后续进行进一步的理解和对比&#xff1a;https://www.coderli.com/git-branch-method/【Java学习交流(982860385)】…

Linux journalctl日志太长,如何倒序查看journalctl --reverse,journalctl -xeu

文章目录 需求实验方法一方法二 需求 Linux journalctl日志太长&#xff0c;如何倒序查看 我们通常关心的是最近的日志&#xff0c;但是每次打开日志都是按时间先后顺序显示的&#xff0c;如何倒序查看&#xff0c;请看下面&#xff1a; 实验 方法一 journalctl 命令默认按…

关于限定视频码率的问题

这几天有人对码率提出要求。其实这本来不是问题。码率是设给编码器的&#xff0c;编码器根据复杂度编码&#xff0c;有时高有时低。 他希望设定码率之后&#xff0c;码率不超过这个值。 你说他无理取闹&#xff1f;强词夺理&#xff1f;其实他的想法也有道理。我现在带宽就这…

Linux工具相关介绍

目录 1.linux安装软件 2.Linux软件生态问题 3.linux软件包管理器yum 4.linux里面好玩的小命令 4.1安装源 4.2小火车 4.3人物说话情景 5.vim简单介绍 5.1简单认识 5.2代码编写 5.3命令模式 1.linux安装软件 1.1源代码安装&#xff1a;这个里面可能根据代码bug需要修改…

AI模型大比拼:Claude 3系列 vs GPT-4系列最新模型综合评测

AI模型大比拼&#xff1a;Claude 3系列 vs GPT-4系列最新模型综合评测 引言 人工智能技术的迅猛发展带来了多款强大的语言模型。本文将对六款领先的AI模型进行全面比较&#xff1a;Claude 3.5 Sonnet、Claude 3 Opus、Claude 3 Haiku、GPT-4、GPT-4o和GPT-4o Mini。我们将从性能…

huawei USG6001v1学习---防火墙高可靠性(双机热备)

1.什么是双机热备 如图&#xff1a;当左图的防火墙发生故障时&#xff0c;整个系统都会收到影响&#xff0c;而右图即使有防火墙发生故障&#xff0c;但是还有一台防火墙做备份&#xff0c;相对于只有一台防火墙&#xff0c;要可靠些。 由于防火墙上不仅需要同步配置信息&…

C# 中的委托

委托的概念 在C#中&#xff0c;委托是一种引用类型&#xff0c;它表示对方法的引用&#xff0c;即委托就是一种用来指向一个方法的引用类型变量。委托的声明类似于方法签名&#xff0c;但是关键字是delegate。下面是一个委托的声明和使用的例子&#xff1a; // 声明一个委托 p…