我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

URAL——1031——(DP)

Posted on 2008-08-20 14:57 Hero 阅读(183) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
 1 //    URAL  1031    C++    Accepted    0.015    377 KB
 2 
 3 //DP--只有3中状态的DP--posi[][]用于预处理
 4 //1. 起点可以大于终点的--特别要注意
 5 //2. 在DP的时候要注意posi[i][j]==i(自身)的时候的情况
 6 
 7 #include <stdio.h>
 8 #include <stdlib.h>
 9 #include <string.h>
10 typedef unsigned int unint ;
11 typedef unsigned long long unllong ;
12 const unint INF = 30e8 ;
13 
14 const int size = 10010 ;
15 int len[3] ;//收费长度标准
16 int cost[3] ;//对应的费用
17 
18 int posi[size][3] ;//记录当前状态的三个前序状态位置
19 unllong dp[size] ;//记录当前位置的最优值
20 
21 int inn ;//车站的个数
22 int sn, en ;//起点--终点
23 int dist[size] ;
24 
25 void input()
26 {
27     scanf( "%d %d %d"&len[0], &len[1], &len[2] ) ;
28     scanf( "%d %d %d"&cost[0], &cost[1], &cost[2] ) ;
29 
30     scanf( "%d"&inn ) ; scanf( "%d %d"&sn, &en ) ; 
31     if( sn > en ) { int temp = sn ; sn = en ; en = temp ; }
32     forint i=2; i<=inn; i++ ) scanf( "%d"&dist[i] ) ;
33 }
34 
35 void process()
36 {
37     forint way=0; way<3; way++ )
38     {//预处理--找到当前状态i的上一个状态位置
39         int curn = en-1 ;//指针
40         forint i=en; i>sn; i-- ) 
41         {
42             while( dist[i]-dist[curn]<=len[way] && curn>=sn ) curn-- ;
43             posi[i][way] = curn+1 ;
44         }
45     }
46 
47     dp[sn] = 0 ;
48     forint i=sn+1; i<=en; i++ )
49     {
50         dp[i] = size*INF ;
51         forint j=0; j<3; j++ ) 
52         {
53             if/*posi[i][j] != i &&*/ dp[i] > dp[posi[i][j]] + cost[j] ) 
54                 dp[i] = dp[posi[i][j]] + cost[j] ;
55         }
56     }
57 }
58 
59 void output()
60 {
61     printf( "%llu\n", dp[en] ) ;
62 }
63 
64 int main()
65 {
66     input() ;
67 
68     process() ;
69 
70     output() ;
71 
72     return 0 ;
73 }


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理