dp数组含义:
d
p
[
i
]
[
j
]
=
dp[i][j]=
dp[i][j]=将j划分为到不超过
i
i
i组中的划分总数。
初始条件:
d
p
[
1
]
[
0
−
n
]
=
1
dp[1][0-n]=1
dp[1][0−n]=1
递推公式:
d
p
[
i
]
[
j
]
=
d
p
[
i
]
[
j
−
i
]
+
d
p
[
i
−
1
]
[
j
]
dp[i][j]=dp[i][j-i]+dp[i-1][j]
dp[i][j]=dp[i][j−i]+dp[i−1][j]
递推方向:左到右,上到下。
结果:
d
p
[
m
]
[
n
]
dp[m][n]
dp[m][n]是否为真
时间复杂度 :
O
(
m
n
)
O(mn)
O(mn)
递推公式的解释:
看到上面
d
p
dp
dp数组的含义我们可能第一反应是这样的递推:
d
p
[
i
]
[
j
]
=
∑
k
=
0
j
d
p
[
i
−
1
]
[
j
−
k
]
dp[i][j]=∑_{k=0}^jdp[i-1][j-k]
dp[i][j]=k=0∑jdp[i−1][j−k]但是这个递推会出现重复的情况,例如:1+1+2=2+1+1。分析发现出现重复的主要原因是:我们是先确定
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]第
i
i
i元素为然后再去确定前面的
i
−
1
i-1
i−1个数,这样就会出现重复,看上面样例,其实在前两个数的组合是没有重复的,当当最后一个数重复取前面的数字时就出现了重复。
如果我们同时改变所有数那就不会出现重复:如果
d
p
[
i
]
[
j
]
=
H
dp[i][j]=H
dp[i][j]=H中没有重复情况,
j
=
∑
k
=
1
i
a
k
j=∑_{k=1}^ia_k
j=∑k=1iak ,如果我们对每个
a
k
a_k
ak加一个
1
1
1,这样的
H
H
H种组合肯定是不重复的,就可以得到
d
p
[
i
]
[
j
+
i
]
dp[i][j+i]
dp[i][j+i]中
H
H
H种不重复的情况,并且这个
H
H
H种情况中不包括
a
k
=
0
a_k=0
ak=0的情况。我们再加上0的情况就是
d
p
[
i
]
[
j
+
i
]
dp[i][j+i]
dp[i][j+i]的总数,当
d
p
[
i
]
[
j
+
i
]
dp[i][j+i]
dp[i][j+i]存在1个0时,切分个数应该是
d
p
[
i
−
1
]
[
j
]
dp[i-1][j]
dp[i−1][j]中没有0元素的情况,当
d
p
[
i
]
[
j
+
i
]
dp[i][j+i]
dp[i][j+i]存在2个0时=
p
[
i
−
1
]
[
j
]
p[i-1][j]
p[i−1][j]中有1个0元素的情况,一此类推,最后:当
d
p
[
i
]
[
j
+
i
]
dp[i][j+i]
dp[i][j+i]存在
1
−
(
i
−
1
)
1-(i-1)
1−(i−1)个0时=
d
p
[
i
−
1
]
[
j
]
dp[i-1][j]
dp[i−1][j]。所以最后的递推公式应该为:
d
p
[
i
]
[
j
]
=
d
p
[
i
]
[
j
−
i
]
+
d
p
[
i
−
1
]
[
j
]
dp[i][j]=dp[i][j-i]+dp[i-1][j]
dp[i][j]=dp[i][j−i]+dp[i−1][j].