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

高精地图语义分割标注 什么是语义分割?语义分割与目标检测的区别?语义分割的关键应用场景有哪些?高精地图语义分割标注的难点? 阅读详情

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;
}
RU DOS版、EFI版32bit/64bit BIOS常用工具 DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。 立即下载

相关推荐

STM32平台下FreeModbus TCP协议栈集成指南

深入讲解在STM32平台如何移植和配置freemodbus协议栈,实现TCP通信功能。结合嵌入式开发细节,帮助开发者快速掌握freemodbus的应用与调试技巧。

weixin_36001279的博客 1142

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

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

JogRunner的专栏 1733

FPGA中的CMAC硬核与Interlaken硬核

CMAC硬核和Interlaken硬核是FPGA中两种重要的内置功能模块,它们分别在CNN推理和高带宽芯片到芯片接口方面发挥着关键作用。FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列)中的CMAC硬核与Interlaken硬核是两种重要的内置功能模块,它们在FPGA设计中扮演着关键角色。需要注意的是,FPGA设计中的硬核选择不仅取决于硬核本身的性能,还需要考虑硬核与FPGA芯片其他部分的兼容性、功耗、成本等因素。Interlaken硬核。

weixin_41230430的博客 1481

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

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南

本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。

weixin_42520909的博客 460

AArch64 ARM64 寄存器介绍

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。

lml435035844的博客 1万+

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

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

yjandx3543的专栏 241

Ubuntu20.04下Pycharm的快速安装与配置指南

本文提供了一份详细的Ubuntu 20.04系统下PyCharm社区版的安装与配置指南。文章重点介绍了通过手动下载.tar.gz压缩包进行安装的灵活方法,并涵盖了系统准备、依赖安装、首次运行、创建快捷方式以及解释器配置等关键步骤,帮助Python开发者快速搭建高效、可控的本地开发环境。

weixin_28831341的博客 379

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

OLED 驱动模块程序代码

作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。 本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。

大橙子的博客 4290

【微服务】SpringBoot 整合Kafka 项目实战操作详解

SpringBoot 整合Kafka 实战操作详解

congge 5570

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

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

weixin_30633507的博客 724

【2005】人工智能⭐

问题的解答来自于过去的经验而不是规则,这些经验是以案例方式存储的。但是当人们遇到一个新的问题的时候,一般先是回忆,从记忆中找到一个与新的问题相似的案例,然后把该案例的有关信息和知识复用到新问题的求解之中。1、若案例(case)不够充足,而有足够的规则(知识),试问如何构建一个包含有基于案例推理和基于规则推理的推理系统,以使推理效率提高而且总能求得问题的解。一般认为,CBR适合缺乏完备和健全的理论,但又可获取丰富经验的领域,而RBR则适合于对领域有充分的认识,能以完备和健全的形式表示领域理论的场合。

super_mochi1 279

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

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

智熄 2052

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

forever_131514的博客 265

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

qq_41997978的博客 258

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

南昌邀请赛网络赛 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、付费专栏及课程。

余额充值