传送门:https://nanti.jisuanke.com/t/38223
题意:给长为n的字符串,是若干个数字加减的式子。每个数字<1e9,也就是说最多9位。这些数字是用火柴拼成的。用这么多个火柴重新拼个式子,操作符数量和数字数量要一样,每个相应位置的数字所在数位要和题目给的式子数位长度一样。
思路:dp[i][j]表示前i个数字用j个火柴能拼出的式子的最大结果。
(↓k表示第i个数字用k个火柴,maxx[a][b]表示数位长度为a,用b个火柴能拼成的最大数字,minn同理)
dp[i][j] = max(dp[i - 1][j - k - 2] + maxx[len[i]][k], dp[i][j]); 加法
dp[i][j] = max(dp[i][j], dp[i - 1][j - k - 1] - minn[len[i]][k]); 减法
所以需要先预处理一下maxx和minn数组,打个表吧↓
void dfs(int pos,int last,int used)//第pos位,枚举之前上一次的数字,枚举之前用的火柴数量
{
if (pos == 10)
return;
for (int i = 2; i <= 7; i++)
{
int now = b[i];
int num = last * 10;
if (i == 6)
{
if (pos != 1)
{
num += 0;
}
else
num += 6;
}
else
{
num += now;
}
int usee = used + i;
minn[pos][usee] = min(minn[pos][usee], num);
dfs(pos + 1, num, usee);
}
}
↑这是minn的,maxx的甚至更方便不用特判6个火柴。
好了预处理完了,就可以愉快地dp了。
吐槽:打表漏了6这个数字错了好久qaq愣是没发现,打表千万别打错鸭!
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
const ll maxv = 103;
ll dp[maxv][maxv * 10];
ll n, t, sum, len[maxv], cnt;
char s[maxv];
ll a[10] = { 6,2,5,5,4,5,6,3,7,6 };
ll b[10] = { 0,0,1,7,4,2,0,8,0,0 };
ll maxx[10][64] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,7,4,5,9,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,11,71,77,74,91,97,94,95,99,98,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,111,711,771,777,911,971,977,974,991,997,994,995,999,998,988,888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1111,7111,7711,7771,9111,9711,9771,9777,9911,9971,9977,9974,9991,9997,9994,9995,9999,9998,9988,9888,8888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,11111,71111,77111,77711,91111,97111,97711,97771,99111,99711,99771,99777,99911,99971,99977,99974,99991,99997,99994,99995,99999,99998,99988,99888,98888,88888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,111111,711111,771111,777111,911111,971111,977111,977711,991111,997111,997711,997771,999111,999711,999771,999777,999911,999971,999977,999974,999991,999997,999994,999995,999999,999998,999988,999888,998888,988888,888888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1111111,7111111,7711111,7771111,9111111,9711111,9771111,9777111,9911111,9971111,9977111,9977711,9991111,9997111,9997711,9997771,9999111,9999711,9999771,9999777,9999911,9999971,9999977,9999974,9999991,9999997,9999994,9999995,9999999,9999998,9999988,9999888,9998888,9988888,9888888,8888888,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11111111,71111111,77111111,77711111,91111111,97111111,97711111,97771111,99111111,99711111,99771111,99777111,99911111,99971111,99977111,99977711,99991111,99997111,99997711,99997771,99999111,99999711,99999771,99999777,99999911,99999971,99999977,99999974,99999991,99999997,99999994,99999995,99999999,99999998,99999988,99999888,99998888,99988888,99888888,98888888,88888888,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111111111,711111111,771111111,777111111,911111111,971111111,977111111,977711111,991111111,997111111,997711111,997771111,999111111,999711111,999771111,999777111,999911111,999971111,999977111,999977711,999991111,999997111,999997711,999997771,999999111,999999711,999999771,999999777,999999911,999999971,999999977,999999974,999999991,999999997,999999994,999999995,999999999,999999998,999999988,999999888,999998888,999988888,999888888,998888888,988888888,888888888}
};
ll minn[10][64] = { {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,1,7,4,2,6,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,11,17,14,12,10,18,22,20,28,68,88,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,111,117,114,112,101,107,104,102,100,108,188,200,208,288,688,888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,1111,1117,1114,1112,1011,1017,1014,1012,1001,1007,1004,1002,1000,1008,1088,1888,2008,2088,2888,6888,8888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11111,11117,11114,11112,10111,10117,10114,10112,10011,10017,10014,10012,10001,10007,10004,10002,10000,10008,10088,10888,18888,20088,20888,28888,68888,88888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,111111,111117,111114,111112,101111,101117,101114,101112,100111,100117,100114,100112,100011,100017,100014,100012,100001,100007,100004,100002,100000,100008,100088,100888,108888,188888,200888,208888,288888,688888,888888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1111111,1111117,1111114,1111112,1011111,1011117,1011114,1011112,1001111,1001117,1001114,1001112,1000111,1000117,1000114,1000112,1000011,1000017,1000014,1000012,1000001,1000007,1000004,1000002,1000000,1000008,1000088,1000888,1008888,1088888,1888888,2008888,2088888,2888888,6888888,8888888,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11111111,11111117,11111114,11111112,10111111,10111117,10111114,10111112,10011111,10011117,10011114,10011112,10001111,10001117,10001114,10001112,10000111,10000117,10000114,10000112,10000011,10000017,10000014,10000012,10000001,10000007,10000004,10000002,10000000,10000008,10000088,10000888,10008888,10088888,10888888,18888888,20088888,20888888,28888888,68888888,88888888,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,111111111,111111117,111111114,111111112,101111111,101111117,101111114,101111112,100111111,100111117,100111114,100111112,100011111,100011117,100011114,100011112,100001111,100001117,100001114,100001112,100000111,100000117,100000114,100000112,100000011,100000017,100000014,100000012,100000001,100000007,100000004,100000002,100000000,100000008,100000088,100000888,100008888,100088888,100888888,108888888,188888888,200888888,208888888,288888888,688888888,888888888}
};
int main()
{
scanf("%lld", &t);
while (t--)
{
cnt = 0;
sum = 0;
memset(len, 0, sizeof(len));
memset(dp, -0x3f, sizeof(dp));
scanf("%lld", &n);
scanf("%s", s + 1);
ll tmp = 0;
for (ll i = 1; i <= n; i++)
{
if (s[i] == '+')
{
sum += 2;
len[++cnt] = tmp;
tmp = 0;
}
else if (s[i] == '-')
{
sum++;
len[++cnt] = tmp;
tmp = 0;
}
else
{
ll num = s[i] - '0';
tmp++;
sum += a[num];
}
}
len[++cnt] = tmp;
int tp = len[1];
minn[1][6] = 0;
for (int i = tp * 2; i <= tp * 7; i++)
{
if(maxx[tp][i]!=0)
dp[1][i] = maxx[tp][i];
}
for (ll i = 2; i <= cnt; i++)
{
for (ll j = 1; j <= sum; j++)
{
for (ll k = 2; k <= 63; k++)
{
ll xx = j - k - 2;
if (xx>=0)
{
if (maxx[len[i]][k] != 0 && dp[i - 1][j - k - 2] != inf)
dp[i][j] = max(dp[i - 1][j - k - 2] + maxx[len[i]][k], dp[i][j]);
}
xx++;
if (xx>=0)
{
if(minn[len[i]][k]!=0 && dp[i - 1][j - k - 1] != inf)
dp[i][j] = max(dp[i][j], dp[i - 1][j - k - 1] - minn[len[i]][k]);
}
//printf("%lld %lld %lld %lld\n", i, j, k, dp[i][j]);
}
}
}
printf("%lld\n", dp[cnt][sum]);
}
return 0;
}