一个问题是,你可能忽略了转移时出现的斜率平台问题。这会导致你二分时可能会被卡掉。
就例如这样的二分能通过此题:
while(l<=r){
int mid=(l+r)>>1;
check(mid);
if(num[n]<=m)r=mid-1,val=mid;
else{
l=mid+1;
}
}
但这样的就通过不了:
while(l<=r){
int mid=(l+r)>>1;
check(mid);
if(num[n]<m)r=mid-1;
else{
val=mid;
l=mid+1;
}
}
其中一种可行的解决方案是:你在dp时强制它选择其中平台的一端。
或者你也可以用上面两种二分分别跑一次,最后取最小值。只不过常数也会乘2。