1.该题中藏着的一个模型题:给定一个区间,以及多个子区间。求最少几个子区间可以把原区间覆盖。
2.先对数据进行处理,得到子区间。代码中每一个右端点,所对应的是可以使区间长度最长的哪个左端点(区间长度越长,所用的区间越少)
3.对每个区间的右端点按照大小顺序进行动态规划。对于每个下标,从这个下标所能覆盖的下标中找到使得覆盖截止到该下标的区间的子区间数目的最小值。
对于那些右端点(所覆盖的点只有本身)dp = INT_MAX(代表不能被覆盖)
class Solution {
public:
int minTaps(int n, vector<int>& ranges) {
vector<int> prev(n+1,INT_MAX),dp(n+1,INT_MAX);
for(int i=0;i<=n;i++){
int l=max(0,i-ranges[i]);
int r=min(n,i+ranges[i]);
prev[r]=min(l,prev[r]);
}
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=prev[i];j<i;j++){
if(dp[j]!=INT_MAX) {
dp[i]=min(dp[i],dp[j]+1);
}
}
}
return dp[n]==INT_MAX?-1:dp[n];
}
};