https://leetcode-cn.com/problems/minimum-number-of-taps-to-open-to-water-a-garden/
dp[位置],表示包括这个位置及之前的位置都已经覆盖了。初始化,dp[0]=0,开始的时候水龙头个数是0。一个水龙头的覆盖范围内,需要两重遍历,找出覆盖范围内的所有子区间,看是否能接的上,以及找出最优值。
class Solution {
public:
int dp[10005];
int minTaps(int n, vector<int>& ranges) {
int INF=0x3f3f3f3f;
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=0;i<ranges.size();i++){
int right=min(i+ranges[i],n);
int left=max(i-ranges[i],0);
for(int i=left;i<right;i++){
for(int j=i+1;j<=right;j++){
dp[j]=min(dp[j],dp[i]+1);
}
}
}
if(dp[n]==INF)
return -1;
return dp[n];
}
};