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];
}
本文探讨了一种算法,旨在解决在不同积雪深度的砖块上行走时,如何最少次数地更换靴子的问题。考虑到靴子的积雪承受能力和步长限制,该算法通过动态规划寻找最优路径。
373

被折叠的 条评论
为什么被折叠?



