【九度OJ】1086【线性动态规划】

来源:互联网 发布:浴缸 知乎 编辑:程序博客网 时间:2024/04/30 13:57

http://www.cnblogs.com/love533/archive/2012/04/01/2429200.html    动态规划思想完全参照该篇博文

这篇文章的做法非常巧妙,AC后时间和空间都是目前提交中最优的。

mincost数组存储A站到B及A,B站之间的站的最小费用,从离A近的站开始求。每次求最小费用有两个步骤

1.找到本站之前距离不超过L3的站的个数count

2.循环count次,将费用分成两段,A站到中间站+中间站到所求站。找到最小的费用。A站到中间站存储在mincost中,中间站到所求站距离不超过L3,费用已知

开始有个疑问是,A站到X站中有X1和X2站,将费用分成三段,A站到X1站+X1站到X2站+X2站到X站,三段费用才是最小费用,会不会出现这种情况?肯定不会,因为在求A到X站的最小费用时,肯定已经求出A站到X2站的最小费用了,不可能存在一个X1站使整体的费用更小。

另外,不要忘记将费用分段,只有超出L3才用动态规划。

另外Java中初始化数组会默认元素为0,则不必再为mincost[0]赋值为0

代码:

package Test1;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.StreamTokenizer;public class Test15_1086 {/** * by qr jobdu 1086 2014-8-12 * @throws IOException  *  * Accepted 70MS */static long L1,L2,L3,C1,C2,C3;public static void main(String[] args) throws IOException {StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));while((st.nextToken())!=StreamTokenizer.TT_EOF){L1=(long)st.nval;  //long型st.nextToken();L2=(long)st.nval;st.nextToken();L3=(long)st.nval;st.nextToken();C1=(long)st.nval;st.nextToken();C2=(long)st.nval;st.nextToken();C3=(long)st.nval;st.nextToken();int A=(int)st.nval;st.nextToken();int B=(int)st.nval;st.nextToken();int N=(int)st.nval;long a[]=new long[N+1];  //第一个站到第N个站的距离a[1]=0;for(int i=2;i<=N;i++){st.nextToken();a[i]=(int)st.nval;}//get the min costlong disAB=a[B]-a[A];if(B==A)     //!!System.out.println("0");else if(disAB<=L1)System.out.println(C1);else if(disAB<=L2)System.out.println(C2);else if(disAB<=L3)System.out.println(C3);else{       //>L3  分段  动态规划思想long mincost[]=new long[B-A+1];  //0号元素是A ,1号元素是A+1。。。。。B-A号元素是B ,i号元素代表A站到第i站的最小花费//mincost[0]=0;  // do not necessary  初始就是0for(int i=A+1;i<=B;i++){  //每for循环一次确定到一个站的最小花费int count=0;while( count <= i-(A+1)&& a[i]-a[i-count-1] <= L3 ){  //计算本站前面不超过L3的站有几个  第i站到A站  第i站和第A站之间最多有(i-(A+1))个站count++;}long min=Long.MAX_VALUE;for(int j=0;j<count;j++){  //依次算出 到本站的最小花费。 实用动态规划的思想。  min为到第i站的最小花费min=Math.min(min, mincost[i-(A+1)-j]+getCost(a[i]-a[i-j-1]));}mincost[i-A]=min;}System.out.println(mincost[B-A]);}}}static long getCost(long dis){if(dis==0)return 0;else if(dis<=L1)return C1;else if(dis<=L2)return C2;else return C3;}}



0 0
原创粉丝点击