C 在回文分区问题中,此dp数组的基本情况dp[0]=-1的用途是什么?

C 在回文分区问题中,此dp数组的基本情况dp[0]=-1的用途是什么?,c,arrays,algorithm,dynamic-programming,C,Arrays,Algorithm,Dynamic Programming,最近我在上遇到了这个问题: 给定一个字符串s,分区s,使得分区的每个子串都是回文 返回s回文分区所需的最小剪切 Example: Input: "aab" Output: 1 Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut. 这是我在互联网上发现的一个C解决方案。我一直在试图理解DP数组正在跟踪什么,我发现在DP[j]中,在字符串的j第个字符处存储回文分区的数量。因此,dp[1

最近我在上遇到了这个问题:

给定一个字符串
s
,分区
s
,使得分区的每个子串都是回文

返回
s
回文分区所需的最小剪切

Example:

Input: "aab"
Output: 1
Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.
这是我在互联网上发现的一个C解决方案。我一直在试图理解DP数组正在跟踪什么,我发现在
DP[j]
中,在字符串的
j
第个字符处存储回文分区的数量。因此,
dp[1]
存储一个单字母元素所需的分区数,它将始终为0,
dp[2]
存储strig的前两个字母所需的分区数

我不明白的是,为什么我们要初始化dp[0]=-1?这似乎有点不直观,我无法找出发生这种情况的原因

int\u min(int a,int b){
返回a=0&&
i+k=0&&
i+k
我用这个函数做了一些跟踪,但似乎仍然找不到答案:这里是我尝试minCut(“aba”)的地方,在第二个换行for循环的每次迭代开始时打印I和dp,在第一个嵌套for循环中出现时也打印
k

i = 0
dp = [-1, 0, 1, 2]
i = 1
dp = [-1, 0, 1, 2]
k = 1
i = 2
dp = [-1, 0, 1, 0]
当我们谈到元素
'b'
时,通过前后展开,我们发现
“aba”
是一个回文。然后,用这个:
dp[i+k+1]=\u min(dp[i+k+1],dp[i-k]+1),我们得到
dp[3]=\u min(dp[3],dp[1-1]+1)=\u min(2,-1+1)=0

为什么基本情况是
dp[0]=-1
,以及它如何影响
\u min(dp[3],dp[0]+1)
,这是令人困惑的。基本上,我们回到没有检测到回文的地方,取这个值+1。但是为什么
minCut(“”=-1


我已经花了2.5个小时试图弄清楚这一点,但我仍然无法弄清楚。

这是一个保护值。当我们不想写额外的
if
s时,我们使用这些东西,然后我们在数据中附加一些保护元素,例如,我们可以使用
(n+2)*(n+2)
矩阵,而不是
n*n
矩阵,在保护位置有一些方便的值,通常是零

注意,每发现一个回文,你就需要再剪一次。这是在更新
dp
时通过
+1
实现的。但当你发现第一个回文时,你不需要对它进行剪切。这与棒切割相同,要将棒切割成一块,根本不需要切割

顺便说一句,如果
s
长度为零,程序返回
-1
,这是错误的


顺便说一句,如果输入字符串看起来像
aaa…aaa
,那么这个程序运行会花费很多时间。基本上,它是
O(n^2)

我把它复杂化了,认为它是某种精心设计的基本案例哈哈