相信有不少的人会参考其中一篇利用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;
}
}
}