题目链接:https://nanti.jisuanke.com/t/38223

题意:有一堆火柴构成了一个加减法式子,你可以把火柴重新组合,要求数字个数和原来一样多,每个数字的位数和对应原数字位数一样多,总火柴数量也一样多,要求你构造新的式子算出来的结果最大。

思路:我们用dp[i][j]表示前i个数 用了j根火柴 所能达到的最大值 为此我们需要先预处理两个数组 mx[i][j] mn[i][j] 分别表示 i位数用了j根火柴的最大值/最小值

于是对于dp方程 我们可以得出 dp[i][j]=max(dp[i-1][j-p-2]+mx[b[i]][j],dp[i-1][j-p-1]+mn[b[i]][j])  其中b[i]是第i个数字的位数 在dp方程中 我们考虑了+和-所带来的影响.

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long int
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[]={,,,,,,,,,,,,};
int dir[][]={, ,, ,-, ,,-};
int dirs[][]={, ,, ,-, ,,-, -,- ,-, ,,- ,,};
const int inf=0x3f3f3f3f;
const ll mod=1e9+;
ll mx[][],mn[][];
int a[]={,,,,,,,,,}; //每个字符消耗的火柴数
ll dp[][]; //前i个数字 用了j根火柴
int b[]; //位数
void init(){
for(int i=;i<;i++)
for(int j=;j<;j++){
mx[i][j]=-; //i位数 用j个火柴可以达到的最大值
mn[i][j]=1e17;//i位数 用j个火柴可以达到的最小值
}
mx[][]=mn[][]=;
for(int i=;i<;i++)
for(int j=;j<=i*;j++)
for(int k=;k<=;k++){
if(j<a[k]) continue;
mx[i][j]=max(mx[i][j],mx[i-][j-a[k]]*+k); //类似背包找最大值
mn[i][j]=min(mn[i][j],mn[i-][j-a[k]]*+k);
}
}
int main(){
ios::sync_with_stdio(false);
init();
int t;
cin>>t;
while(t--){
memset(dp,-,sizeof(dp));
memset(b,,sizeof(b));
int n;
cin>>n;
string s;
cin>>s;
int len=s.length();
int m=; //火柴数
int k=; //字符数
for(int i=;i<len;i++){
if(s[i]=='+'){
k++;
m+=;
}else if(s[i]=='-'){
k++;
m++;
}else{
m+=a[s[i]-''];
b[k]++;
}
}
for(int i=;i<=m;i++)
if(mx[b[]][i]!=-)
dp[][i]=mx[b[]][i]; //初始化边界
for(int i=;i<=k;i++)
for(int j=;j<=m;j++)
for(int p=;p<=;p++){
if(j-p->=&&dp[i-][j-p-]!=-){ //考虑+号
if(mx[b[i]][p]!=-)
dp[i][j]=max(dp[i][j],dp[i-][j-p-]+mx[b[i]][p]);
}
if(j-p->=&&dp[i-][j-p-]!=-){ //考虑-号
if(mn[b[i]][p]!=1e17)
dp[i][j]=max(dp[i][j],dp[i-][j-p-]-mn[b[i]][p]);
}
}
cout<<dp[k][m]<<endl;
}
return ;
}

ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)的更多相关文章

  1. 2019The Preliminary Contest for ICPC China Nanchang National Invitational

    The Preliminary Contest for ICPC China Nanchang National Invitational 题目一览表 考察知识点 I. Max answer 单调栈+ ...

  2. The Preliminary Contest for ICPC China Nanchang National Invitational

    目录 Contest Info Solutions A. PERFECT NUMBER PROBLEM D. Match Stick Game G. tsy's number H. Coloring ...

  3. 计蒜客 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 ...

  4. The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...

  5. The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest

    打网络赛 比赛前的准备工作要做好 确保 c++/java/python的编译器能用 打好模板,放在桌面 A. PERFECT NUMBER PROBLEM #include <cstdio> ...

  6. The Preliminary Contest for ICPC China Nanchang National Invitational I题

    Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values ...

  7. Max answer(The Preliminary Contest for ICPC China Nanchang National Invitational)

    Alice has a magic array. She suggests that the value of a interval is equal to the sum of the values ...

  8. The Preliminary Contest for ICPC China Nanchang National Invitational I.Max answer单调栈

    题面 题意:一个5e5的数组,定义一个区间的值为 这个区间的和*这个区间的最小值,注意数组值有负数有正数,求所有区间中最大的值 题解:如果全是正数,那就是原题 POJ2796 单调栈做一下就ok 我们 ...

  9. 2019 The Preliminary Contest for ICPC China Nanchang National Invitational(A 、H 、I 、K 、M)

    A. PERFECT NUMBER PROBLEM 题目链接:https://nanti.jisuanke.com/t/38220 题意: 输出前五个完美数 分析: 签到.直接百度完美数输出即可 #i ...

随机推荐

  1. Java基础差,需要怎么补

    本文首发于本博客 猫叔的博客,转载请申明出处 感谢sugar的提问:Java基础差,需要怎么补? 欢迎关注公众号:Java猫说 我整体的总结了一下,大致分为以下的几个点说一下: 1.善于使用搜索引擎 ...

  2. PhP数据库 Mysql dos命令

    mysql 这是一个关系型数据库,存在表的概念. 结构 数据库可以存放多张表,每个表可以存放多个字段,每个字段可以存放多个记录. dos命令操作数据库 phpstudy使用终端打开数据库 第一步: 第 ...

  3. Servlet练习:实现增删改查的综合练习

    ---恢复内容开始--- 本文为原创,转载请注明出处:https://www.cnblogs.com/Tom-shushu/p/9383066.html 本篇内容主要介绍:通过Servlet,JSP, ...

  4. Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

    关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了S ...

  5. 关于图片适配不同尺寸的image View(实战)

    分享人:广州华软 佐罗 一. 前言 在前端开发过程中,设计稿中往往只提供一张图片,但是app内需要用到的尺寸各种各样. 同时图片不仅是信息的直接表达,也会为网站起到美观点缀的作用,图片的变形.过分裁切 ...

  6. 简单的shell命令

    grep echo 重定向与管道 tr 特殊文件:/dev/null,/dev/tty 基本命令查找 访问shell脚本的参数 简单的执行跟踪: set -x set +x

  7. DevExpress TreeList 禁止节点拖动到其他节点上

    背景 在做一个类似文件树的控件,支持节点从树上向其它的控件拖动程序,但是要保证树上的节点不能拖动上其他的节点上. 代码 /// <summary> /// 拖动节点完成 /// </ ...

  8. 深圳市共创力咨询CEO杨学明的最新演讲:互联网模式下的企业创新管理

    2018年11月14日, 深圳市共创力咨询董事长.深圳市汇成研发管理咨询公司董事长杨学明先生受邀参加由深圳图书馆主办,深圳手讯视频承办的“倾听行业之声”2018第二届世界CED智慧大会,此次分享的主题 ...

  9. extjs 倒计时

    var interval = (new Date(selection[0].data.dealLimitTime).getTime() - new Date().getTime()) / 1000; ...

  10. [20190423]那个更快的疑问3.txt

    [20190423]那个更快的疑问3.txt --//前一阵子,做了11g在单表单条记录唯一索引扫描的测试,摘要如下:--//参考链接:http://blog.itpub.net/267265/vie ...