n
块砖,第i
块砖积雪f[i]
英尺。b
双靴子,编号从0
到b-1
,第i
双靴子能在至多s[i]
英尺深的积雪行走,步长最多为d[i]
。每次可以选择不换靴子继续走,或者丢弃当前的靴子换上当前编号最小的靴子,或者丢弃当前编号最小的靴子,求走到最后一块砖最小丢弃的靴子数。
样例
给定 n=10
, b=4
, f=[0,2,8,3,6,7,5,1,4,0]
, s=[2,4,3,7]
, d=[3,2,4,1]
, 返回 2
。
穿编号为0的靴子,到达编号为1的砖块。
丢弃编号为0的靴子,穿编号为1的靴子,到达编号为3的砖块。
丢弃编号为1的靴子,穿编号为2的靴子,达到编号为7的砖块。
不换靴子到达编号为9的砖块。
总共丢弃了两双靴子。
注意事项
- f[0] = f[n - 1] = 0f[0]=f[n−1]=0
- 2 \leq n, b \leq 2502≤n,b≤250
- 0 \leq f[i], s[i] \leq 10^90≤f[i],s[i]≤109
- 1 \leq d[i] \leq n - 11≤d[i]≤n−1
某一个点i最小值,等于前面的一些点j来走到,限制条件不要漏写!!!!!(i-j<=d[k]&&f[i]<=s[k]&&f[j]<=s[k])
public int getMinimumNumOfBoots(int n, int b, int[] f, int[] s, int[] d) {
int dp[]=new int[n];
dp[0]=0;//下标为0,也代表换了0双鞋
for(int i=1;i<n;i++){//d[i]=dp[i-k] dp[i-k]+1
dp[i]=n+99999;
for(int j=0;j<i;j++){
for(int k=dp[j];k<b;k++){
if(k>=dp[i]) break;
if(i-j<=d[k]&&f[i]<=s[k]&&f[j]<=s[k]){//f[j]<=s[k]!!!
dp[i]=Math.min(dp[i],k);
break;
}
}
}
}
return dp[n-1];
}