poj 1390 较难的区间dp

poj 1390 Blocks(记忆化搜索/动态规划) 程序设计实习递归练习 Blocks 阅读详情

7月9日二更:突然发现一个神奇的事情,把代码写成这样会更快(110ms)(就是用临时变量ans代替f[l][r][elen]),可见全局变量的寻址时间还是比较长的

开O3优化,实际效果几乎等于0

int dp(int l, int r,int elen) {
	if (l == r)return (len[r] + elen) * (len[r] + elen);
	if (f[l][r][elen])return f[l][r][elen];

	int ans = dp(l, r - 1, 0) + (elen + len[r])*(elen + len[r]);
	for (int i = l; i <= r - 2; i++) 
		if (col[i] == col[r]) {
			ans = max(ans, dp(l, i, elen + len[r])
				+ dp(i + 1, r - 1, 0));
		}
		
	return f[l][r][elen] = ans;
}

网上的代码基本上都一样,都是从北大的算法课过来的。

题意:给你一个涂有颜色的方块的序列,每次你可以删除一些相同颜色并且相邻的颜色块,并获得删除数目平方的收益,现在给你一个颜色块序列,问收益最大值是多少?

Sample Input

2 //表示t
9 //n
1 2 2 2 2 3 3 3 1 //表示颜色
1
1
Sample Output

Case 1: 29
Case 2: 1

思路:
第一步先把方块合并成连续且颜色一样的大块,方便处理。

对于L到R区间的最优解,一般人可能会想,要么分成三截,先删除中间一节,然后期望两边的颜色一样,在删除两边的;或者直接从中间切成两截,然后求值。比较两种情况的最大值。

其实这种思路是有问题的,比如1 2 1 1 1 2 1 ,你可以分成五截,1 3 5截颜色一样,你可以先删除2 4 截,然后1 3 5 一起删,明显比上一种想法更优。

但你不可能枚举每中分截情况,所以你可以考虑先把右边的留着不删,假设dp(l,r,e)表示l,r区间的最大值,且之前还有e个方块没删,e的颜色和第r个方块颜色一样。

你有两种方案,第一种是把r和e一起删了,然后去计算dp(l,r-1,0);第二种是中间有个方块k和r同色,那么期望k和r+e合并在删,就是dp(l, k, e + len[r])+ dp(k+ 1, r - 1, 0)。dp(l, k, e + len[r])表示l到k区间的最优解,希望e+len[r]+len[k]可以继续往下合并,dp(k+ 1, r - 1, 0)就是k+1到r-1的最优解。

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>

#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int

using namespace std;

int t, n, a[222],f[222][222][222],len[222],col[222],tot;

int dp(int l, int r,int elen) {
	if (l == r)return (len[r] + elen) * (len[r] + elen);
	if (f[l][r][elen])return f[l][r][elen];

	f[l][r][elen] = dp(l, r - 1, 0) + (elen + len[r])*(elen + len[r]);
	for (int i = l; i <= r - 2; i++) 
		if (col[i] == col[r]) {
			f[l][r][elen] = max(f[l][r][elen], dp(l, i, elen + len[r])
				+ dp(i + 1, r - 1, 0));
		}
		
	return f[l][r][elen];
}

int main() {
	scanf("%d", &t);
	for (int c = 1; c <= t; c++) {
		scanf("%d", &n);
		tot = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%d", a + i);
			if (i == 1 || a[i] != a[i - 1]) {
				len[++tot] = 1;
				col[tot] = a[i];
			}
			else
				len[tot]++;
		}
		
		memset(f, 0, sizeof(f));
		printf("Case %d: %d\n", c, dp(1, tot,0));
	}
	
	return 0;
}

[POJ1390]Blocks(方块消除) Description Some of you may have played a game called ‘Blocks’. There are n blocks in a row, each box has a color. Here is an example: Gold, Silver, Silver, Silver, Silver, Bronze, Bronze, Bronze, Go 阅读详情

相关推荐

POJ1390--blocks.rar

1390--blocks.rar

POJ_1390(三维动规)

POJ_1390,三维动规题目,按照大块分类,参考博客,重点: 1.构造递归函数 2.通过三维数组记忆化保存 #include<iostream> #include<cstring> #include<cstdio> using namespace std; struct Box{ int color,len; }box[205]; int t,n,x,...

宫·商的博客 460

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

本文以诺依项目为例详细记录了Kubernetes集群的部署过程以及配套DevOps环境的搭建。主要内容包括:1) 配置8个节点的软硬件环境;2) 基础环境准备(网络、防火墙、Docker等);3) 三节点Kubernetes集群部署;4) GitLab代码仓库安装;5) Harbor私有镜像仓库搭建;6) Jenkins持续集成工具配置;7) 基于若依项目的CI/CD实践;8) Rancher集群管理工具部署。

hickman2023的博客 1201

POJ 1390:Blocks

将Q与左边的某个大块k合并 score[i][j][len]=score[i][k][len+big[j].len]+score[k+1][j-1][0]一行有n个块,每个框都有一个颜色。将Q消去 score[i][j][len]=score[i][j-1][0]+(big[j].len+len)*(big[j].len+len)因此再考虑利用二维数组score[i][j]来表达状态,即代表第i个大块到第j个大块可以获得的最高分数,则与score[i][j-1]相比,可能。

weixin_74991413的博客 249

ESP32蓝牙广播数据自定义指南:让你的设备更容易被手机发现

本文详细介绍了如何通过自定义ESP32蓝牙广播数据提升设备在手机端的可发现性。从广播数据结构、扫描响应优化到跨平台兼容性设置,提供了全面的技术指南和实战代码示例,帮助开发者解决智能硬件开发中的蓝牙连接难题。

weixin_29172201的博客 271

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道

本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。

weixin_30399821的博客 734

一次搞定 SAP IDoc 失败重处理与安全清理:BD87 实战指南

本文介绍了SAP IDoc错误处理的BD87实战指南。主要内容包括: BD87的核心功能:监控IDoc处理状态并支持人工重处理或标记删除,适用于入站/出站IDoc故障处理。 重处理前的关键步骤: 区分技术错误与业务错误 检查是否允许重复处理 确认日期范围设置正确 标准操作流程:通过BD87选择错误IDoc节点执行重处理,特别适用于状态51的应用错误。 标记删除操作:将无用IDoc标记为可清理状态,后续可通过WE11物理删除或归档处理。 常见问题解决方案:包括权限控制、批量处理优化建议以及自动化定位工具的开发

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 452

poj1390解题报告

题目大意:题意:给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值。(有点像祖玛弹珠的即视感) 解题思路:据说是lrj大神黑书上的题,反正我后翻了别人的解题报告才做出来的 首先:合并初始相邻相同的块,得到颜色数组c和对应的长度len,例如 1 1 1 1 1 3 2 2 1 1 1 可记为color[ 1 ] = 1; len[1 ] = 5;

h123120的专栏 1578

AI 编程工具面试题(Claude Code、Codex 等)基础篇(一)

文章摘要: 本文整理了20道AI编程工具基础面试题,涵盖Claude Code、Codex CLI、GitHub Copilot等主流工具的核心概念与实操技巧。内容分为工具分类(代码补全/对话式/自主代理)、安装配置(静默部署/API管理)、关键命令(上下文加载/token监控)、调试策略(错误处理/提示优化)及对比选型(Tabnine vs Copilot)。重点解析了终端工具与模型能力的差异,并针对实际场景(如长代码生成/私有化部署)提供解决方案。附追问环节,深入探讨工具边界问题(如上下文溢出处理)和成

篮球界最会写bug的人;程序猿中打球最菜的人。 336

信号处理算法:自适应滤波_(8).自适应陷波器

自适应陷波器是一种强大的工具,广泛应用于电力系统、通信系统和生物医学信号处理等领域。通过自适应调整滤波器的参数,自适应陷波器可以在特定频率处形成陷波,从而有效地抑制噪声或干扰信号。常见的自适应算法包括LMS和RLS,它们各有优缺点,可以根据实际需求选择合适的算法。

2401_87715305的博客 1371

区间dp+三维状态,POJ1390 Blocks

比较难想的一个状态设计,当二维无法获取区间细节时,采取升维策略

EQUINOX1的博客 953

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1152

poj1390 方块消除 dp

参考:徐源盛《对一类动态规划问题的研究》以及刘汝佳的黑书《算法艺术与信息学竞赛》 将方块序列,按颜色分成一段一段的,例如 1 1 1 1 1 3 2 2 1 1 1 可记为color[ 1 ] = 1; len[1 ] = 5; color[ 2 ] = 3; len[ 2 ]

2659

YOLOv11改进 - C3k2融合 | C3k2 融合 ARConv 自适应矩形卷积:动态调整卷积核形状与采样点

本文介绍了将自适应矩形卷积(ARConv)模块与YOLOv11相结合的方法。ARConv是针对遥感图像全色锐化任务设计的创新卷积模块,可自适应调整卷积核形状与采样点数量,解决传统卷积刚性限制,实现高效特征提取。其工作流程包括学习卷积核高度和宽度、选择采样点数量、生成采样图、卷积实现与空间自适应增强。我们将集成ARConv的C3k2_ARConv模块引入YOLOv11,对相关代码进行修改和注册,并配置了yolov11 - C3k2_ARConv.yaml文件。实验脚本显示,该结合方式应用于目标检测任务。

魔改工程师的博客 1005

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

POJ 1390 Blocks 区间dp

http://poj.org/problem?id=1390 https://www.acwing.com/problem/content/324/ 题意: n个木块排成一列,每个木块都有一个颜色。 每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除。 如果一次性消除了k个木块,那么就会得到k*k分。 给定你一个游戏初始状态,请你求出最高得分是多少 输入格...

forOnward的博客 254

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

POJ-1390-Blocks (复杂区间DP)

\(POJ~1390~~Blocks:\) (很难想的区间DP) \(solution:\) 很好的一道题目。看起来似乎很简单,当时一直认为可以用二维区间DP来完成,转移 \(n^3\)。 后来发现如果用二维表示当前状态,转移可以说无路可走。因为可能存在原本不相邻的多个区间最后是一起消除的。所以我们需要保留下来某一段重复的区间做为我们的一个新的维度。 或者说,(存在原本不相邻的多个区间最后...

weixin_30535565的博客 179

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

POJ 1390 Blocks 区间DP

区间DP的核心:把大区间分解成相同规模的小区间,小区间返回子结构的值给大区间从而得到最优解。但是怎么就能根据不同的题模拟出特定的比较合适的子结构呢?我觉得与其说这是一种编码的熟练度问题,不如说是对实际问题建模的敏感度问题。如何设计优秀的子结构问题真的很考验一个人的最基本最核心的创造力和分析能力,刷题套模板真的能整出来吗。。。 就拿这个题来说,可以很轻易的想到dp[i][j]为i到j区间的最优值,...

lizhenhao 244

蓝书(算法竞赛进阶指南)刷题记录——POJ1390 Blocks(区间DP+记忆化搜索)

题目:POJ1390. 题目大意:给定一个长度为nnn的序列,每次可以删除权值相同连续一段且得分为长度的平方,求最大得分. 数据组数≤15\leq 15≤15,1≤n≤2001\leq n\leq 2001≤n≤200. 按照区间DP的套路,设f[l][r]f[l][r]f[l][r]表示区间[l,r][l,r][l,r]的答案,发现根本没办法转移. 考虑无法转移的原因是什么,我们发现在转移的时候...

hzk_cpp的博客 314

POJ 1390 Blocks (区间DP) 题解

题意 t组数据,每组数据有n个方块,给出它们的颜色,每次消去的得分为相同颜色块个数的平方(要求连续),求最大得分。 首先看到这题我们发现我们要把大块尽可能放在一起才会有最大收益,我们要将相同颜色块合在一起,我们可以分区间进行处理,便可用区间dp解决,我们尝试合并区间我们定义状态f[i][j]表示合并i-j这个区间的最大得分,那么状态转移方程便可写为 f[i][j]=max(f[i][j]...

aqg41577的博客 265

【POJ 1390】Blocks

http://poj.org/problem?id=1390 黑书上的例题,感觉我这辈子是想不到这样的dp了QAQ \(f(i,j,k)\)表示将\(i\)到\(j\)合并,并且假设未来会有\(k\)个与\(a_j\)同色的方块与\(j\)相连的最大得分。 如果直接消去第\(j\)个区域和未来会接到\(j\)后面的\(k\)块,那么 \(f(i,j,k)=f(i,j-1,0)+(b_j+...

as2886089的博客 182

poj 1390 Blocks(dp,黑书dp方块消除)

poj 1390 Blocks

yjCola 978

poj1390 Blocks(经典区间dp/消除问题)

题目 思路来源 https://www.cnblogs.com/Tieechal/p/11637638.html清楚明白的讲解 题解 和[Luogu2135] 方块消除及UVA10559 Blocks是一模一样的题目 代码 #include<iostream> #include<cstdio> #include<cstring> us...

小衣同学的博客 610

[题]Blocks #区间DP

这是详解,贼长。详解博客 简单点说,自己看代码理解。 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 220; int t, n, a, co[N], cnt, f[N][N][N], len[N]; int read() { int ret = 0; char ch = getchar(); while (.

仅仅是笔记。 85

poj 1390 Blocks

<br />//poj 1390 解法很巧妙,见lrj黑书。。。<br />#include <iostream><br />#include <algorithm><br />using namespace std;<br /><br />int n,m;<br />int color[205],len[205];<br />int dp[205][205][205];<br />int after[205];<br />int main()<br />{<br />    int t,a;<br /> 

birdforever的专栏 914

【poj1390】Blocks【区间dp】

传送门 一道很nice的题。首先肯定将颜色相同的缩点,因为中间不可能插进去不同的。 首先可以很明白的看出是区间动态规划。但是接下来我们发现不太清楚怎么转移,因为中间和两边选的顺序可能不一样。 我们考虑最右边这个大联通块有多少个颜色一样的。因为有些可能是别人并过来的。 然后策略就分两种。一种是直接把最右边的吃了。另一种是把中间的吃了然后把右边的弄过来整成一块。 设f(l,r,k)表示这个区...

gigo_64 sink in my world 146
上一篇: poj 1191
下一篇: poj 1463 简单树状dp
FawkesLi
博客等级 码龄8年 21粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值