题目链接: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. mybatis bug之org.apache.ibatis.exceptions.PersistenceException:

    详细报错信息: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java. ...

  2. Yii2设计模式——单例模式

    应用举例 在Yii.php中: require __DIR__ . '/BaseYii.php'; // Yii框架的帮助类,提供框架基本的功能 class Yii extends \yii\Base ...

  3. Django学习之十: staticfile 静态文件

    目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方面 总结 Django学习之十: staticfile 静态文件 理解阐述     ...

  4. 【Oracle RAC】Linux系统Oracle12c RAC安装配置详细记录过程V2.0(图文并茂)

    [Oracle RAC]Linux系统Oracle12c RAC安装配置详细过程V2.0(图文并茂) 2 Oracle12c RAC数据库安装准备工作2.1 安装环境介绍2.2 数据库安装软件下载3 ...

  5. python使用rabbitMQ介绍二(工作队列模式)

    一模式介绍 第一章节的生产-消费者模式,是非常简单的模式,一发一收.在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者. 队列模型: 这时mq实现了一下几个功能: rabbitmq循环 ...

  6. Windonws基本命令手册

    1. gpedit.msc-----组策略  2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. ...

  7. SpringBoot中使用JNnit4(入门篇)

    一.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. R语言学习——图形初阶之散点图

    使用R内置的数据框mtcars,绘制车身重量与每加仑汽油行驶的英里数的散点图,要求横轴为车身重量(wt),纵轴为每加仑汽油行驶的英里数(mpg),并添加最优拟合曲线.标题,输出为pdf文件.代码实现如 ...

  9. python day07

    数据类型之间的相互转换 1.字符串转换成数字类型 判断哪些可以转换成数字型可以参考下面例题: # 判断实现将所有能转换为数字类型的字符串都转换为对应类型的数字# int: '10' = > 10 ...

  10. UML在代码中的展现

    依赖:一个类使用了另外一个类,这种关系是临时的.脆弱的. 如人需要过河,需要船,这时人.过河(船)  中船被当做参数传入,船的实现变化会影响过河方法.     聚合:体现是整体与部分.has-a的关系 ...