ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)
题目链接: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)的更多相关文章
- 2019The Preliminary Contest for ICPC China Nanchang National Invitational
The Preliminary Contest for ICPC China Nanchang National Invitational 题目一览表 考察知识点 I. Max answer 单调栈+ ...
- 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 ...
- 计蒜客 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 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
打网络赛 比赛前的准备工作要做好 确保 c++/java/python的编译器能用 打好模板,放在桌面 A. PERFECT NUMBER PROBLEM #include <cstdio> ...
- 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 ...
- 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 ...
- The Preliminary Contest for ICPC China Nanchang National Invitational I.Max answer单调栈
题面 题意:一个5e5的数组,定义一个区间的值为 这个区间的和*这个区间的最小值,注意数组值有负数有正数,求所有区间中最大的值 题解:如果全是正数,那就是原题 POJ2796 单调栈做一下就ok 我们 ...
- 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 ...
随机推荐
- [MySQL] mysql的逻辑分层
mysql逻辑分层:1.client ==>连接层 ==>服务层==>引擎层==>存储层 server2.连接层: 提供与客户端连接的服务3.服务层: 1.提供各种用户使用的接 ...
- 微擎模块的安装文件manifest.xml
微擎在安装或卸载模块时会根据manifest.xml生成(或删除)数据库中相应记录,并执行manifest.xml里指定的脚本. manifest.xml文件内容详细介绍如下: manifest - ...
- Docker-compose command 有多个命令例子
cat docker-compose.yml version: '3.4' services: klvchen: image: python_django:19.03.0 ports: - 8000: ...
- MyBatis Generator 生成器把其他数据库的同名表生成下来的问题
[问题] 使用MyBatis Generator生成器时,发现Mapper文件中出现字段与连接数据库不符,经过查找发现该表是其他数据库的同名表的字段. [解决问题] 在构造文件中,这里是generat ...
- Numpy库的学习(五)
今天继续学习一下Numpy库,废话不多说,整起走 先说下Numpy中,经常会犯错的地方,就是数据的复制 这个问题不仅仅是在numpy中有,其他地方也同样会出现 import numpy as np a ...
- Spark Streaming 快速入门
一.简介 1.便于使用 Spark Streaming将Apache Spark的 语言集成API 引入流处理,使您可以像编写批处理作业一样编写流式作业.它支持Java,Scala和Python. 2 ...
- Eclipse为工具包关联源码(本例工具包为dom4j-1.6.1)
最近学习了dom4j解析xml文件,然而在eclipse中,每次想看源码都要去到源代码文件里看,不能在eclipse中直接看, 然后我就瞎折腾,终于知道怎么把源代码添加到eclipse中了.(我的ec ...
- apache ranger源码编译
官方文档 http://ranger.apache.org/quick_start_guide.html Quick Start Guide Build Process 1. Check out th ...
- Element-UI动态更换主题
参考:vue-基于elementui换肤[自定义主题] 实践: 需求1.后期维护主题色不更换: 直接在线主题生成工具下载,在APP.VUE引入:(注意Element UI 版本1.3?2.0) 需求 ...
- HTML之表单
目录 表单的结构 get方式与post方式 输入 单行文本输入框 提交按钮和重置按钮 密码输入框 复选框 单选按钮 图像按钮 文本选择输入框 隐藏框 多行文本输入框 下拉列表框 新增输入元素 新增其他 ...