如果你只有hack的#3WA
查看原帖
如果你只有hack的#3WA
389053
酒笙清梅楼主2024/8/3 22:21

相信有不少的人会参考其中一篇利用num[i][j]记录字符串第i-j位表示的数字,你不妨测试一下我这组数据:


10000000000000 1


很显然答案是1(在1和0之间一个加号就行了),但如果你输出是2,那么你大概率就说我说的问题了。 为了避免i-j位代表的值太大导致溢出,会将i-j位代表值直接赋值为inf(无穷大),但是你不能这么写:

if (j >= i + 6) num[i][j] = inf;

想一想为什么?上面的样例已经给出了答案,如果你这么做,从第二位开始后面的0000000实际上等于0,而你将其赋值为了inf,导致在遍历i=n时会无法搜索到以第一位为结束的情况而直接提前结束在i=n-6的位置,而此时dp[n-6][target]+1=2,导致答案错误。


所以直接判断累加值是否大于值域(1e5)进行赋值即可

for (int i = 1; i <= n; i++)
{
	for (int j = i; j <= n; j++)
	{
		num[i][j] = num[i][j - 1] * 10 + s[j] - '0';
		if (num[i][j] > 1e5)
		{
			while (j <= n) num[i][j++] = inf;
		}
	}
}
2024/8/3 22:21
加载中...