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

题目传送门

题目就会给你一个长度为n的字符串,其中\(1<n<100\)。这个字符串是一个表达式,只有加减运算符,然后输入的每一个字符都是可以由若干个火柴棒拼接而成的。

现在在不改变每个数的位数,数的总数以及运算符的个数的前提下,可以对火柴棒重新拼接。询问最后可以拼接出来的最大值是多少。

这个自己看下题目可能要清楚一些= =

 

每一个字符都是由若干个火柴棒构成的,我们可以考虑类似于背包的思路来求解。

因为每个数的位数最后都没发生变化,所以我们可以预处理出\(f[i][j]\)以及\(g[i][j]\),分别表示\(i\)位数由\(j\)根火柴构成的最大/最小值。

因为这里除开火柴棒个数之外还涉及到了加减号,所以我们定义\(dp(i,j,0/1)\)为前\(i\)个数字,用了\(j\)根火柴棒,并且当前这个数字前面是\(-\)还是\(+\)。

由于数据范围比较小,所以考虑加和减两种情况进行合理转移就行了。

详见代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1005;
int n, T;
char s[N] ;
int len[N] ;
ll dp[105][N][2], f[105][N], g[105][N];
int trans1[10] = {0, 0, 1, 7, 4, 5, 9, 8} ;
int trans2[10] = {0, 0, 1, 7, 4, 2, 0, 8} ;
int num ;
int main() {
cin >> T;
for(int i = 1; i <= 10; i++)
for(int j = 2; j < N; j++) {
g[i][j] = 1e14;
f[i][j] = f[i][j - 1] ;
for(int k = 2; k <= 7; k++) {
if(j - k >= 0) f[i][j] = max(f[i - 1][j - k] * 10 + trans1[k], f[i][j]) ;
}
}
for(int i = 1; i <= 10; i++)
for(int j = 2; j < N; j++) {
if(i == 1) {
g[i][j] = 1;
continue ;
}
g[i][j] = g[i][j - 1] ;
for(int k = 2; k <= 7; k++) {
if(j - k >= 0) g[i][j] = min(1ll * g[i - 1][j - k] * 10 + 1ll * trans2[k], g[i][j]) ;
}
}
while(T--) {
memset(dp, 0, sizeof(dp)) ;
scanf("%d", &n);
scanf("%s", s + 1);
int cnt = 0, x = 0, num = 0;
for(int i = 1; i <= n; i++) {
if(s[i] == '+' || s[i] == '-') {
len[++num] = cnt ;
cnt = 0;
if(s[i] == '+') x += 2;
else x += 1;
} else {
cnt++;
if(s[i] == '1') x += 2 ;
else if(s[i] == '7') x += 3 ;
else if(s[i] == '4') x += 4 ;
else if(s[i] == '5' || s[i] == '2' || s[i] == '3') x += 5;
else if(s[i] == '0' || s[i] == '6' || s[i] == '9') x += 6;
else x += 7;
}
}
len[++num] = cnt;
for(int i = 2; i <= x; i++) dp[1][i][0] = dp[1][i][1] = f[len[1]][i] ;
for(int i = 2; i <= num; i++) {
for(int j = 2; j <= x; j++) {
for(int k = 2; k <= j; k++) {
if(j - k - 2 >= 2) {
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k - 2][1] + f[len[i]][k]) ;
dp[i][j][1] = max(dp[i][j][1], dp[i - 1][j - k - 2][0] + f[len[i]][k]) ;
}
if(j - k - 1 >= 2) {
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k - 1][0] - g[len[i]][k]) ;
dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - k - 1][1] - g[len[i]][k]) ; }
}
}
}
ll ans = 0;
ans = max(ans, max(dp[num][x][0], dp[num][x][1])) ;
cout << ans << '\n';
}
return 0 ;
}

南昌邀请赛网络赛 D.Match Stick Game(dp)的更多相关文章

  1. 2019 ICPC南昌邀请赛网络赛比赛过程及题解

    解题过程 中午吃饭比较晚,到机房lfw开始发各队的账号密码,byf开始读D题,shl电脑卡的要死,启动中...然后听到谁说A题过了好多,然后shl让blf读A题,A题blf一下就A了.然后lfw读完M ...

  2. POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum

    http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...

  3. [2019南昌邀请赛网络赛D][dp]

    https://nanti.jisuanke.com/t/38223 Xiao Ming recently indulges in match stick game and he thinks he ...

  4. icpc 南昌邀请赛网络赛 Max answer

    就是求区间和与区间最小值的积的最大值 但是a[i]可能是负的 这就很坑 赛后看了好多dalao的博客 终于a了 这个问题我感觉可以分为两个步骤 第一步是对于每个元素 以它为最小值的最大区间是什么 第二 ...

  5. icpc 南昌邀请赛网络赛 Subsequence

    题目链接:https://nanti.jisuanke.com/t/38232 就是判断输入是不是子序列 没想到贡献了将近十几次罚时..........可以说是菜的真实了 用cin cout超时了 改 ...

  6. 2019 ICPC南昌邀请赛 网络赛 K. MORE XOR

    说明 \(\oplus x​\)为累异或 $ x^{\oplus(a)}​$为异或幂 题意&解法 题库链接 $ f(l,r)=\oplus_{i=l}^{r} a[i]$ $ g(l,r)=\ ...

  7. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  8. 2019ICPC南昌邀请赛网络赛 I. Max answer (单调栈+线段树/笛卡尔树)

    题目链接 题意:求一个序列的最大的(区间最小值*区间和) 线段树做法:用单调栈求出每个数两边比它大的左右边界,然后用线段树求出每段区间的和sum.最小前缀lsum.最小后缀rsum,枚举每个数a[i] ...

  9. 2019南昌邀请赛网络赛:J distance on the tree

    1000ms 262144K   DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(N ...

随机推荐

  1. 7.openldap使用ssl加密认证

    作者:yaoyao 1.服务器端部署 1.自建CA中心 1.CA中心生成自身私钥 #cd /etc/pki/CA #(umask 077; openssl genrsa -out private/ca ...

  2. Daily Scrum (2015/10/25)

    今天终于到了周末的尾声,我们的组员也应该正常得投入到工作中了.这天晚上我(符美潇)和PM(潘礼鹏)和两个DEV开了一个小会,讨论一下我们本周的代码编写工作.我们了解到大家的代码阅读工作和相关知识的学习 ...

  3. 20172329 2018-2019《Java程序设计与数据结构》课程总结

    作者:lalalouye(20172329王文彬) 2018-2019年大二Java程序设计与数据结构课程总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 实验一 实验二 ...

  4. vs2013+python+ cocos2d-x-3.3rc0环境搭建

    1.vs2013安装一路next,安装即可,时间1~2个小时 2.解压cocos2d-x-3.3rc0   build文件夹里会有名为  cocos2d-win32.vc2012的sln文件  打开  ...

  5. 使用exe4j将jar包导出为exe

    Exe4J使用方法 此工具是将Java程序包装成exe格式文件工具.(点击exe4j\bin\exe4j.exe文件)启动后如下图所示 如果未注册,则可使用这个注册码:A-XVK209982F-1y0 ...

  6. 谈对“Git”的认识与理解

    自诞生于2005年以来,Git日臻完善,在高度易用的同时,仍然保留着初期设定的目标.它的速度飞快,及其适合管理大项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求.接着说说 ...

  7. 第一次Sprint计划

    目标: 各成员先学习基于eclipse开发android应用软件的基本技术(砍柴要先磨刀,工具都没怎么做) 先弄一个简单的四则运算答题功能看看程序是否能在手机上运行 (以上为冲刺一内容) 时间: 5月 ...

  8. Aspose 插件

    百度:Aspose Aspose.Cells.dll Aspose.Slides.dll Aspose.Words.dll

  9. vue 使用出现的问题(持续记录)

    今天写vue 的时候,发现有几个警告.原因是 我把组件起的名字写的和默认标签的名字一样了,导致系统不知道,怎么解析. 我写了一个Header 组件, 和h5里面的header重名, 解决方案1: he ...

  10. 关于react 官方脚手架使用出现的问题

    首先按照官网说明,一路的安装下来,很顺利,然后开始运行吧,提示个错误,缺少index.js 文件  原来是默认给出的文件是App.js 如何更改呢 找到react-script模块文件夹config下 ...