Ex 6_2 假设您准备一次长途旅行..._第五次作业

假设n个旅馆距离原点的距离存放在数组arr[0. . .n-1]中,punish[0. . .n-1]表示在某个旅馆停留时所受的的惩罚的最小值。当然在第一个旅馆停留时所受到的惩罚为0,即punish[0]=0。若i>0,则在第i个旅馆停留时所受到的惩罚的最小值符合递推式:

 1 package org.xiu68.ch06.ex5;
 2 
 3 public class Ex6_2 {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         int[] arr=new int[]{200,300,450,600,700,850};
 8         minPunish(arr);
 9         
10                 /*
11                 punish[0]=0
12                 punish[1]=10000
13                 punish[2]=12500
14                 punish[3]=15000
15                 punish[4]=25000
16                 punish[5]=27500
17                 */
18 
19     }
20     /*
21      * arr[0]~arr[n-1]为n个旅店,值为距离原点的距离
22      */
23 
24     public static void minPunish(int[] arr){
25         if(arr==null || arr.length==0)
26             return;
27         int[] punish=new int[arr.length];            //记录停留在第i个旅店所受到总的最小惩罚值
28         punish[0]=0;                                //在第一个旅店受到的惩罚为0
29         System.out.println("punish[0]=0");
30         for(int i=1;i<arr.length;i++){
31             int twoPlacePunish=200-(arr[i]-arr[i-1]);
32             punish[i]=(int) (punish[i-1]+Math.pow(twoPlacePunish, 2));
33 
34             for(int j=i-2;j>=0;j--){
35                 if(arr[i]-arr[j]>200)
36                     break;
37                 
38                 int temp=punish[j]+(200-(arr[i]-arr[j]))^2;
39                 if(punish[i]>temp)
40                     punish[i]=temp;
41             }
42             System.out.println("punish["+i+"]="+punish[i]);
43         }//for
44         
45     }
46     
47 }
View Code
原文地址:https://www.cnblogs.com/xiu68/p/7989131.html