1. 程式人生 > >lintcode 1686. 雪地靴

lintcode 1686. 雪地靴

n塊磚,第i塊磚積雪f[i]英尺。b雙靴子,編號從0b-1,第i雙靴子能在至多s[i]英尺深的積雪行走,步長最多為d[i]。每次可以選擇不換靴子繼續走,或者丟棄當前的靴子換上當前編號最小的靴子,或者丟棄當前編號最小的靴子,求走到最後一塊磚最小丟棄的靴子數。

樣例

給定 n=10b=4f=[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]≤10​9​​
  • 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];
	    }