Match Stick Game 【2019南昌邀请赛网络赛D】

传送门: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;
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值