题目链接: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[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
ll mx[11][1007],mn[11][1007];
int a[10]={6,2,5,5,4,5,6,3,7,6}; //每个字符消耗的火柴数
ll dp[100][1000]; //前i个数字 用了j根火柴
int b[100]; //位数
void init(){for(int i=0;i<11;i++)for(int j=0;j<1007;j++){mx[i][j]=-1; //i位数 用j个火柴可以达到的最大值 mn[i][j]=1e17;//i位数 用j个火柴可以达到的最小值
        }mx[0][0]=mn[0][0]=0;for(int i=1;i<11;i++)for(int j=0;j<=i*7;j++)for(int k=0;k<=9;k++){if(j<a[k]) continue;mx[i][j]=max(mx[i][j],mx[i-1][j-a[k]]*10+k); //类似背包找最大值 mn[i][j]=min(mn[i][j],mn[i-1][j-a[k]]*10+k);}
}
int main(){ios::sync_with_stdio(false);init();int t;cin>>t;while(t--){memset(dp,-1,sizeof(dp));memset(b,0,sizeof(b));int n;cin>>n;string s;cin>>s;int len=s.length();int m=0; //火柴数int k=1; //字符数for(int i=0;i<len;i++){if(s[i]=='+'){k++;m+=2;}else if(s[i]=='-'){k++;m++;}else{m+=a[s[i]-'0'];b[k]++;    }}for(int i=0;i<=m;i++)if(mx[b[1]][i]!=-1)dp[1][i]=mx[b[1]][i]; //初始化边界 for(int i=2;i<=k;i++)for(int j=0;j<=m;j++)for(int p=1;p<=700;p++){if(j-p-2>=0&&dp[i-1][j-p-2]!=-1){ //考虑+号 if(mx[b[i]][p]!=-1)dp[i][j]=max(dp[i][j],dp[i-1][j-p-2]+mx[b[i]][p]);}if(j-p-1>=0&&dp[i-1][j-p-1]!=-1){ //考虑-号 if(mn[b[i]][p]!=1e17)dp[i][j]=max(dp[i][j],dp[i-1][j-p-1]-mn[b[i]][p]);}}cout<<dp[k][m]<<endl;}return 0;
}

转载于:https://www.cnblogs.com/wmj6/p/10779932.html

ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)相关推荐

  1. The Preliminary Contest for ICPC China Nanchang National Invitational

    Problem A PERFECT NUMBER PROBLEM https://nanti.jisuanke.com/t/38220 题解:打表 /* *@Author: STZG *@Langua ...

  2. The Preliminary Contest for ICPC China Nanchang National Invitational 南昌网络赛2019

    题解不太详细,仅提供AC代码 A. PERFECT NUMBER PROBLEM #include <bits/stdc++.h> using namespace std;int main ...

  3. ICPC China Nanchang National Invitational - I. Max answer(线段树+ST)

    题目链接 N个数字求一个区间使得∑i=li=ra[i]×∑i=li=rmin(a[i])\sum_{i=l}^{i=r} a[i] × \sum_{i=l}^{i=r}min(a[i])∑i=li=r ...

  4. 2019 ICPC Asia Nanchang Regional

    2019 ICPC Asia Nanchang Regional C. And and Pair E. Bob's Problem 链接:https://www.jisuanke.com/contes ...

  5. ACM ICPC China final G Pandaria

    目录 ACM ICPC China final G Pandaria ACM ICPC China final G Pandaria 题意:给一张\(n\)个点\(m\)条边的无向图,\(c[i]\) ...

  6. 2019 ICPC Asia Nanchang Regional And and Pair 组合数学

    传送门 文章目录 题意: 思路: 题意: 给一个长度为nnn的二进制,求满足如下条件的j,ij,ij,i对数: (1)0<=j<=i<=n(1)0<=j<=i<=n ...

  7. 2019 ICPC Asia Nanchang Regional K.Tree 树上启发式合并 + 动态开点线段树

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每个点都有一个权值valvalval,求满足以下条件 (1)x!=yx!=yx!=y (2)xxx和yyy不互为祖先 (3)val[lca(x,y ...

  8. C - Mr. Panda and Strips Gym - 101194C(思维//尺取//2016 icpc china final)

    VJ地址 题意:选择一段or两段连续的区间,合成一段序列,使得选择的序列中没有相同的数字,求序列最长的长度 思路:由于是区间内不能有相同的数字,所以考虑用尺取,可以2*n的时间枚举第一段的长度,然后剩 ...

  9. ICPC 2005 hangzhou Generator (UVA1358)KMP + 期望DP / 高斯消元

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Generator Weblink https://www.luogu.com.cn/problem/ ...

最新文章

  1. centos 编译安装mysql
  2. CSS魔法堂:重拾Border之——更广阔的遐想
  3. mysql模糊匹配like 之 %
  4. 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
  5. java1.8--改进的接口
  6. sql java 创建数据库_java动态创建数据库(sql server)
  7. 对Java中字符串的进一步理解
  8. Linux批量转图,CMYK转RGB
  9. python3.7打包exe后有显示no utf-8_pyinstaller打包py文件时出现错误SyntaxError: Non-UTF-8 code starting with '\xb3'...
  10. 一年月份大小月口诀_大月小月口诀 什么意思 有多少天
  11. 厉害!张近东钦点,80后郝嘉成苏宁北京300亿市场掌舵人
  12. Word无法打开该文件,因为文件格式与文件扩展名不匹配 | 无法从该位置打开扩展名为.asd的文件
  13. 如何卸载干净MySQL??
  14. 水面漂浮物垃圾识别检测系统 YOlOv7
  15. ubuntu16.04下安装新版QQ
  16. weixin小程序和公众号抓包方法分享
  17. 2018.03.18 临汾市游记
  18. 20180903有关复数共轭的理解
  19. java 字节 字符
  20. LeetCode知识点总结 - 844

热门文章

  1. android编译的错误日志,android编译遇到错误
  2. 调查问卷java源码_2020年Java技术趋势
  3. oracle服务器文件有哪些,Oracle服务器参数文件维护的技巧有哪些呢?
  4. windows 64 搭建RabbitMQ环境
  5. centeros php,CenterOs7 安装oracle19c的方法详解
  6. java地址有什么构成_IP地址采用分层结构,由(     )组成。
  7. MCU——TC04B触摸按键芯片驱动
  8. python 实例对象 浅拷贝_Python 对象的深拷贝与浅拷贝 -- (转)
  9. seconds_behind_master入门
  10. 什么是去中心化?交易所为什么要去中心化?