【九度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
- 【九度OJ】1086【线性动态规划】
- 九度OJ 1086 最小花费--动态规划
- 动态规划 - 九度OJ 1480
- 九度OJ 1499 动态规划
- 九度OJ 1547 动态规划
- 九度OJ 教程99 动态规划之《搬寝室》
- 九度OJ 1462 动态规划变形之《两船载物问题》
- 九度OJ 1077 最大序列和 -- 动态规划
- 九度OJ 1451 不容易系列之一 -- 动态规划
- 九度OJ 1452 搬寝室 -- 动态规划
- 九度OJ 1453 Greedy Tino -- 动态规划
- 九度OJ 1410 垒积木 -- 动态规划
- 九度OJ 1408 吃豆机器人 -- 动态规划
- 九度OJ 1209 最小邮票数 -- 动态规划
- 九度OJ 1533 最长上升子序列 -- 动态规划
- 九度OJ 1547 出入栈 -- 动态规划
- 九度OJ 1499 项目安排 -- 动态规划
- 【九度OJ】1480【动态规划】【C实现】【北大2012】
- 什么是ROM、RAM、DRAM、SRAM和FLASH的区别
- python常用的十进制、16进制、字符串、字节串之间的转换(长期更新帖)
- 【Ruby】技巧之把Array转换成Hash
- Spring3拦截引发的问题——WEB开发中的客户端路径
- 基本 SVG 动画
- 【九度OJ】1086【线性动态规划】
- 二级指针
- OC整理
- CMEMK Error: Failed to find a pool which fits 622080
- 开源项目网址集合
- UVA 11987——Almost Union-Find(并查集+删除操作)
- Multi-resolution support
- 分支和循环
- HDU 4944 FSF’s game 规律题