【2019 南昌邀请赛 Match Stick Game】 火柴dp

我用 AI 做了个开源地图工具:从 OpenStreetMap 一键获取全国 AOI/POI 数据 本文介绍了一款免费开源的OSM数据查询与可视化工具,旨在解决Overpass QL语法晦涩、数据获取门槛高的问题。工具支持面数据(AOI)、点数据(POI)及路网三种查询模式,内置30+常用模板实现一键检索。具备高德与OSM双底图切换、坐标自动转换功能,支持GeoJSON、SHP、CSV多格式导出,同时保留自定义查询能力。作为纯HTML单文件应用,可零成本部署至GitHub Pages在线使用。该工具有效降低了地理数据获取难度,是替代商业地图API、高效提取全球开源地理信息的实用利器。 阅读详情

https://nanti.jisuanke.com/t/38223

题意

给出一个用火柴组成的表达式,由k个项和k-1个运算符组成。要求重组这些火柴,使得重组后的表达式结果最大。
重组的表达式要满足下面条件。

  1. 每项的位数必须相同,不能有前导零。
  2. 项数必须相同。

题解

预处理出
f[i][j][0/1]:代表i位数用j根火柴组成的最大/最小数。
mx[k]: k根火柴可以组成的最大值。
f [ i ] [ j ] [ 0 ] = m a x { f [ i − 1 ] [ j − k ] [ 0 ] ∗ 10 + m x [ k ] } f[i][j][0] = max\{f[i-1][j-k][0]*10+mx[k]\} f[i][j][0]=max{f[i−1][j−k][0]∗10+mx[k]}。
mn[k]: k根火柴可以组成的最小值。
f [ i ] [ j ] [ 1 ] = m i n { f [ i − 1 ] [ j − k ] [ 1 ] ∗ 10 + m n [ k ] } f[i][j][1] = min\{f[i-1][j-k][1]*10+mn[k]\} f[i][j][1]=min{f[i−1][j−k][1]∗10+mn[k]}

dp[i][j][0/1]: 前i项还剩j根火柴,前面运算符 是+/- 得出的最大值。
0: 代表前面是+,1: 代表前面是-,v[i]:第i项是几位数。
k: 该项用k根火柴。
d p [ i ] [ j ] [ 0 ] = m a x { d p [ i − 1 ] [ j − k − 2 ] [ 0 ] + f [ v [ i ] ] [ j − k − 2 ] [ 0 ] , d p [ i − 1 ] [ j − k − 1 ] [ 1 ] + f [ v [ i ] ] [ j − k − 1 ] [ 0 ] } dp[i][j][0] = max\{dp[i-1][j-k-2][0]+f[v[i]][j-k-2][0], dp[i-1][j-k-1][1]+f[v[i]][j-k-1][0]\} dp[i][j][0]=max{dp[i−1][j−k−2][0]+f[v[i]][j−k−2][0],dp[i−1][j−k−1][1]+f[v[i]][j−k−1][0]}
d p [ i ] [ j ] [ 1 ] = m a x { d p [ i − 1 ] [ j − k − 1 ] [ 0 ] + f [ v [ i ] ] [ j − k − 1 ] [ 1 ] , d p [ i − 1 ] [ j − k − 1 ] [ 1 ] + f [ v [ i ] ] [ j − k − 1 ] [ 1 ] } dp[i][j][1] = max\{ dp[i-1][j-k-1][0]+f[v[i]][j-k-1][1], dp[i-1][j-k-1][1]+f[v[i]][j-k-1][1]\} dp[i][j][1]=max{dp[i−1][j−k−1][0]+f[v[i]][j−k−1][1],dp[i−1][j−k−1][1]+f[v[i]][j−k−1][1]}

意思就是,如果第i项前面是+号,那么就要让该项加上尽量大的值,否则就加上尽量小的值。所以要预处理出f数组。

要特别注意初始化!!!

代码

#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 200;
const int mx[] = {0,0,1,7,4,5,9,8}; // i根火柴最大数是多少 
const int mn[] = {0,0,1,7,4,2,0,8};
int tot, cnt;
char s[maxn];
ll f[maxn][705][2]; // 第i个数还剩j根火柴的 最大/最小 数
ll dp[maxn][705][2]; // 前i个数字 还剩 j 根火柴 组成的式子最大是多少
void init() {
	for(int i = 1; i <= 10; ++i)
		for(int j = 0; j <= 700; ++j)
			f[i][j][0] = -1e14, f[i][j][1] = 1e14;
	f[0][0][0] = f[0][0][1] = 0;
	for(int i = 1; i <= 10; ++i) {
		for(int j = 2; j <= 100; ++j) {
			for(int k = 2; k <= 7; ++k) {
				if(j-k >= 0) {
					f[i][j][0] = max(f[i][j][0], f[i-1][j-k][0]*10+mx[k]);
					f[i][j][1] = min(f[i][j][1], f[i-1][j-k][1]*10+mn[k]);
				}
			}
			// cout << i <<" " << j << " " << f[i][j][1] << endl;
		}
	}
}

int main() {
	int T;
	scanf("%d", &T);
	init();
	while(T--) {
		int n;
		scanf("%d", &n);
		scanf("%s", s);
		tot = cnt = 0;
		int len = strlen(s);
		vector<int> v;
		int t = 0;
		for(int i = 0; i < len; ++i) {
			if(s[i] >= '0' && s[i] <= '9') {
				t++; 
			}
			if(s[i] == '1') tot += 2;
			else if(s[i] == '2') tot += 5;
			else if(s[i] == '3') tot += 5;
			else if(s[i] == '4') tot += 4;
			else if(s[i] == '5') tot += 5;
			else if(s[i] == '6') tot += 6;
			else if(s[i] == '7') tot += 3;
			else if(s[i] == '8') tot += 7;
			else if(s[i] == '9') tot += 6;
			else if(s[i] == '0') tot += 6;
			else if(s[i] == '+') {tot += 2; cnt++; v.push_back(t); t = 0;}
			else if(s[i] == '-') {tot += 1; cnt++; v.push_back(t); t = 0;}
		}
		v.push_back(t);

		for(int i = 0; i < v.size(); ++i) for(int j = 0; j <= tot; ++j) dp[i][j][0] = dp[i][j][1] = -1e14;
		for(int j = 2; j <= tot; ++j) {
			dp[0][j][1] = dp[0][j][0] = f[v[0]][j][0];
			// cout << 0 <<" " << j << " " << dp[0][j][0] << endl;
		}
		for(int i = 1; i < v.size(); ++i) {
			for(int j = 0; j <= tot; ++j) {
				for(int k = 0; k <= j; ++k) {
					if(k+2 <= j) {
						dp[i][j][0] = max(dp[i][j][0], dp[i-1][j-k-2][0]+f[v[i]][k][0]);
						dp[i][j][0] = max(dp[i][j][0], dp[i-1][j-k-2][1]+f[v[i]][k][0]);
						// cout << dp[i-1][j-k-2][0]<<" " << dp[i-1][j-k-2][1] << " "<< f[v[i]][k][0] << endl;
						// cout << dp[i][j][0] << endl;	
					}

					if(k+1 <= j) {
						dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-k-1][0]-f[v[i]][k][1]);
						dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-k-1][1]-f[v[i]][k][1]);
					}
				}
				// cout << i << " " << j <<" " << dp[i][j][1] << endl;
			}
		}
		ll ans = -1e14;
		// cout << cnt << endl;
		for(int i = 0; i <= tot; ++i) {
			ans = max(ans, max(dp[cnt][i][0],dp[cnt][i][1]));
		}
		printf("%d\n", ans);
	}
	return 0;
}
别再手动敲代码了!用STM32CubeMX+FreeRTOS图形化配置,5分钟搞定多任务通信框架 本文详细介绍了如何利用STM32CubeMX和FreeRTOS快速搭建多任务通信框架,大幅提升嵌入式开发效率。通过图形化配置工具,开发者可在5分钟内完成任务调度、时钟配置和内核对象生成,特别适合物联网设备开发。文章还提供了代码优化和调试技巧,帮助开发者轻松应对复杂应用场景。 阅读详情

相关推荐

rk3399 hdmi HDCP key烧录

1.key转换 使用 hdcp\ProvisioningTool_20170526\KeyConverterV2.02 目录下的KeyConvertor.exe工具将1.4key进行转换 转换后得到 TX00000001.skf 文件,将 TX00000001.skf 文件烧录到开发板上,烧录方式: 打开文件 hdcp\ProvisioningTool_20170526\ProvisioningTool20170526\ProvisioningTool.exe 选择烧录方式与烧录路...

qq_32645109的博客 3857

给你些火柴棍,找出能摆的最大大值和最小值

#include //本题据说是个动态规划,本人硬着头皮去找规律,所以代码只能说是投机,或者说是暴力去解决问题的。 #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

JogRunner的专栏 1733

开源网格划分软件-Gmsh二次开发教程 (4)网格生成与控制​

​本章将深入讲解Gmsh的网格生成技术,包括全局/局部网格控制、边界层生成、自适应细化等,并提供完整的代码示例。

ZQGG的博客 1472

JZOJ__Day 9:【普及模拟】算法学习(sfxx)

题目描述自从学习了动态规划后,Famer KXP对动态规划的热爱便一发不可收拾,每天都想找点题做,一天,他找到了一道题,但是不会做,于是,他找到了你。题目如下: 给出N个无序不重复的数,再有M个询问,每次询问一个数是否在那N个数中,若在,则ans增加2^K,K为该数在原数列中的位置。 由于ans过大,所以只要求你输出ans mod 10^9+7。输入第一行,两个数N,M,第二行N个数,第三行

Beautiful women in tights 534

DDR4/LPDDR4与DDR5/LPDDR5的差别

最新的 DDR5 可支持单一芯片容量 64Gbit,最高容量上限可增加到 128GB,较 DDR4 提高了四倍;价格:随着规格提升,DDR5 价格也较 DDR4 高出逾 50%,可能成为业者导入的阻碍。但如前所述,包括 5G、机器学习(ML)等各式进阶应用中,DDR5 的整体效能、规格的提升,对相关业者来说仍具一定优势与吸引力。电源管理 IC(PMIC IC):电源管理芯片内建至 DDR5 内存中,除可提高讯号完整性及噪声辨识能力,还能更具效率与扩展性;DDR5 规格与效能整理。(来源:JEDEC)

flomingo1的专栏 9014

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9199

“火柴棍式”程序员面试题

有时候,有些面试题是很是无厘头,这不,又有一个,还记得小时候玩的的“火柴棍游戏”吗,就是移动一根火柴棍改变一个图或字的游戏。程序面试居然也可以这么玩,看看下面这个火柴棍式的程序面试题吧。 下面是一个C程序,其想要输出20个减号,不过,粗心的程序员把代码写错了,你需要把下面的代码修改正确,不过,你只能增加或是修改其中的一个字符,请你给出三种答案。 [code="java"]int n =...

yjandx3543的专栏 241

城市NOA加速落地,BEV+Transformer引领自动驾驶感知新范式

数据闭环能力的建立,不仅依赖于数据规模,还依赖于数据的筛选、回传、标注、训练、验证与再部署,数据之于自动驾驶的价值再被印证的同时,也将推动自动驾驶迈向更为高阶的智能化时代。6月份,理想汽车向早鸟用户推送了首个不依赖高精地图的城市NOA。而特斯拉推出的基于BEV+Transformer的自动驾驶感知路线,可将2D图像转化为BEV鸟瞰图视角下的3D图像,并基于更庞大、更复杂、参数更多的感知算法模块,利用Transformer的注意力机制,将各个传感器统一到同一个连续的四维(三维空间+一维时间)时空中。

manfukeji的博客 1396

2019年ICPC南昌网络赛 D. Match Stick Game (记搜)

题库链接:https://nanti.jisuanke.com/t/38223 Xiao Ming recently indulges in match stick game and he thinks he is good at it. His friend Xiao Jun decides to test him. Xiao Jun gives him an expression of le...

LSD20164388的博客 481

Win10如何使用BC3.1精简版

Win10如何使用BC3.1精简版 使用Borland C++3.1 学习μC/OS—Ⅱ几乎是现在的普遍做法,但是由于Win10系统不能直接使用BC3.1,所以需要用到DOSBox。 1、解压bc3.1精简版压缩包,本文将BC3.1文件夹复制在D盘下,DOSBOX按照默认路径安装。下图为两者安装目录图示: 2、修改DOSBOX的配置文件,找到DOSBox文件安装路径,记事本方式打开DOSBox 0.74-3 Options.bat文件,在此文件末尾添加: MOUNT C D:\BC//意为把D:\BC目录

qq_45547236的博客 2376

YOLOv13改进策略【Neck】| CVPR2024 LGAG:大核分组注意力门模块,3×3分组卷积与注意力协同的特征精准融合

本文记录的是利用LGAG 模块改进 YOLOv13 的颈部融合部分。(Large-kernel Grouped Attention Gate)通过3×3分组卷积与注意力机制结合,引导解码器处理特征与跳接特征的精准融合。本文利用模块,通过3×3分组卷积扩大感受野以捕捉更广泛局部空间上下文,同时结合注意力机制生成自适应注意力系数,对YOLOv13中关键目标特征赋予高激活值、抑制冗余背景特征,在特征融合阶段实现全局语义与局部细节的高效结合,减少计算成本的同时提升特征表达能力,增强模型对复杂场景下目标的检测精度与效

Limiiiing的博客 103

移动一根火柴使等式成立js版本(递归)

修改成递归版本 思路:   1、设定规则数组,比如:1加一根火柴只可以变成7.   2、设定方法数组,比如:一个数增加了一根火柴,其他的数必然减少一根火柴。   3、增加Array方法,由元素名和方法,得到规则对象。   4、增加替换数组元素的方法,根据原数组和下标,得到 一个字符串。有2个方法,一个深度copy,一个普通指针,这样就可以自由选择是否改变原来的数组了。   5、主逻辑:...

weixin_30633507的博客 724

2023华为od机试C卷【推荐多样性】Java&Go 实现

推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略1.各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一元素,再从第二个列表中为每屏选择一个元素,依次类推2.每个列表的元素尽量均分为N份,如果不够N个,也要全部分配完,

MISAYAONE的博客 2180

Match Stick Game 【2019南昌邀请赛网络赛D】

传送门:https://nanti.jisuanke.com/t/38223 题意:给长为n的字符串,是若干个数字加减的式子。每个数字<1e9,也就是说最多9位。这些数字是用火柴拼成的。用这么多个火柴重新拼个式子,操作符数量和数字数量要一样,每个相应位置的数字所在数位要和题目给的式子数位长度一样。 思路:dp[i][j]表示前i个数字用j个火柴能拼出的式子的最大结果。 (↓k表示第i个...

智熄 2052

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2019年南昌邀请赛网络赛 D(Match Stick Game)DP

题目传送门:https://nanti.jisuanke.com/t/38223 题意:给你长度为n的字符串,1 <= n <= 100 .字符串是由表达式组成,只有加减运算,字符串的每个字符都可以由火柴组成,通过移动火柴,使得表达式的值最大。没有前导零,并且每个数的位数不变。 附带题解 看了题解后还是清楚,应该是太笨了吧,QAQ。 看了这位大佬的博客才了解了------&g...

forever_131514的博客 265

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

2019南昌邀请赛网络赛D:Match Stick Game (背包dp)

题目大意:给一个表达式,全部由火柴棒组成,其中操作符只有’+’ 和 ‘-‘两种,现在你可以移动任意根火柴棒修改这个表达式,问表达式的最大值是多少。注意修改表达式要保证操作符仍然只有’+’ 和 '-'两种,且操作数位数不变。 分析:乍一看无从下手,一步一步分析吧。从网上的资料来看有两种思考入手点。 每个数字需要的火柴棒的数目不同,这个是很好求的,这意味着你修改某些数字可能会导致火柴棒多出来,而某些地...

qq_41997978的博客 258

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

南昌邀请赛网络赛 D.Match Stick Game(dp)

南昌邀请赛网络赛 D.Match Stick Game 题目传送门 题目就会给你一个长度为n的字符串,其中\(1<n<100\)。这个字符串是一个表达式,只有加减运算符,然后输入的每一个字符都是可以由若干个火柴棒拼接而成的。 现在在不改变每个数的位数,数的总数以及运算符的个数的前提下,可以对火柴棒重新拼接。询问最后可以拼接出来的最大值是多少。 这个自己看下题目可能要清楚一些...

dft539533的博客 158

南昌邀请赛网络赛 D. Match Stick Game(dp)

题目链接: Match Stick Game 题意: 给定一个表达式,只包含加减法,其中每个数字都是用棍子拼起来的,包括加减号(具体详见题目链接)。现在可对棍子进行重新分配。但需要保证运算符号数量不变,且参与运算的每个数的位数也不变,且其初始值<=1e9。求重新分配后表达式结果的最大值。 思路: 先处理出棍子的总数( sum )和参与运算的每个数的位数。 设 dp[i...

残阳止水 338

计蒜客 难题题库 211 火柴棍游戏

32次  9.37%  1000ms  65536K 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法类似于电子表显示时间的方式。 注意: 1.  加号与等号各自需要两根火柴棍 2.  如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C> =0) 3.  n

呈凹的博客 1206

铺瓷砖 状压dp经典问题

题意 给出 n×m的矩形方块,可以往上面铺1×2的砖块,问铺满这个方块的方案有多少种。 题解 砖块可以竖铺和横铺,竖铺的话会影响到下一行,横铺的话不会影响到下一行,这里我们令 1:表示该方块不会影响下一行,0:表示该方块会影响下一行。 条件一: 考虑(i.j)这一格,如果(i-1,j)上是0,那说明(i-1,j)是竖铺的砖块,那么(i,j)便是1,该点不会影响到下一行了。若(i-1,j)是1,那么...

Link_Ray的博客 2225

[蓝桥杯]倍数问题(背包问题)

复杂度O(3∗n∗k)O(3*n*k)O(3∗n∗k),目测只能过80%的数据,请dalao帮忙给出优化✧(≖ ◡ ≖✿) #include <bits/stdc++.h> using namespace std; #define FOR0(a,b) for(int i = a; i < b; ++i) #define FORE(a,b) for(int i = a; i &lt...

Link_Ray的博客 1758

codeforces 1110 D JongMa 思维dp

题目链接:https://codeforces.com/contest/1110/problem/D 题意 给出n个不超过m的序列,三个相同的数或者三个连续的数可以构成一个三元组,问这个序列最多可以构造出多少个三元组。 题解 对于一个数字i,[i,i+1,i+2]这样连续的序列最多不超过2个,因为一旦有3个,那就和[i,i,i],[i+1,i+1,i+1],[i+2,i+2,i+2] 这样没有差别...

Link_Ray的博客 1316

POJ1088滑雪问题 简单dp(动态规划)已AC

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 99422   Accepted: 37756 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等

Link_Ray的博客 976

【Gym 101775】 H. H. Mr. Panda and Birthday Song(动态规划,分类讨论)

https://codeforc.es/gym/101775/problem/H 题意 连续出现元音长度 >= x || 连续出现辅音长度 >= y ,输出DISLIKE。 连续出现元音长度 < x && 连续出现辅音长度 <y,输出LIKE。 即满足1又满足2,输出SURPRISE。 题解 对于1,直接贪心求最大的连续元音/辅音次数,即遇到?时,元/辅...

Link_Ray的博客 958

POJ1661 help Jimmy(动态规划)

题目链接:http://poj.org/problem?id=1661 测试数据: 3 3 8 7 2 6 14 6 4 10 4 5 14 2 1 6 10 20 2 3 5 2 8 15 20 7 9 13 5 10 2 answer: 17 10 17 题目要求我们求出Jimmy到地面的最短时间,相信大家都能看得懂题...

Link_Ray的博客 840

【codeforces gym101853E】Maximum Sum 状态dp经典问题

https://codeforces.com/gym/101853/problem/E 题意 给一个n×m的矩阵,要求选出一些点,使得这些点不相邻,同时这些点的和要最大。相邻的意义是,行或列或对角的距离等于1。 1 <= n <= 16 题解 一看到n的范围就想到状压dp,这和铺瓷砖很类似,就是一层一层的转移状态。如果直接暴力枚举状态的话复杂度是O(n∗22n)O(n*2^{2n})O...

Link_Ray的博客 833
上一篇: 博弈论SG函数
下一篇: 2018 CCPC-final K - Mr. Panda and Kakin(RSA解密) 和 第十届蓝桥省赛C++A组填空题 RSA解密(非暴力解法)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值