一开始是这么想的,对于每一个区间,取到一个数的时候,要么就取这个数,要么就不取这个数,取到取不到,结合前面那个点是取到还是没取到的状态,可以写出一个弱智的转移方程来。然后,我就因为无法充分地降维放弃了这个想法。其实大佬们是这样做这个题的,每一个数,作为当前区间当前点被选中时,可以作为当前这个新区间的起点,也可以不作为当前这个新区间的起点。这样写出来的转移方程,可以把数组降一维防止炸空间,还可以开一个额外的数组在时间上再降一维,最终达到了可以接受的复杂度。
大佬核心代码:
for (int i=1; i<=m; i++)
{
maxx=-922337203685477580;
for (int j=i; j<=n; j++)
{
if (i==j) dp[j]=mk[j-1]+num[j];
else dp[j]=max(dp[j-1],mk[j-1])+num[j];
mk[j-1]=maxx;
if (maxx<dp[j]) maxx=dp[j];
}
}