lintcode 1686. 雪地靴
阿新 • • 發佈:2018-12-30
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]; }