SDUT 2430 pillars(DP)

题目链接

今天下午队内测试赛的题,据宝哥说,TC上的500,我想了N久。。。开始理解题意都很费劲,这要去做TC,还不被虐成渣了。。。想清楚就了就很简单了,还好过了。。。

有点贪心,但是感觉应该是这样。每一个柱子头部或者底部,到下一个的头部或者底部策略最优,这样就A了。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 int p[1001][3];
 5 double o[1001][3];
 6 double Max(double a,double b)
 7 {
 8     return a > b ? a:b;
 9 }
10 int main()
11 {
12     int n,i,j,w,k;
13     while(scanf("%d",&n)!=EOF)
14     {
15         memset(o,0,sizeof(o));
16         for(i = 1;i <= n;i ++)
17         {
18             scanf("%d",&p[i][2]);
19             p[i][1] = 0;
20             p[i][2] --;
21         }
22         scanf("%d",&w);
23         for(i = 2;i <= n;i ++)
24         {
25             for(j = 1;j <= 2;j ++)
26             {
27                 for(k = 1;k <= 2;k ++)
28                 {
29                     if(o[i][k] < o[i-1][j] + sqrt((p[i][k]-p[i-1][j])*(p[i][k]-p[i-1][j])+w*w))
30                     o[i][k] = o[i-1][j] + sqrt((p[i][k]-p[i-1][j])*(p[i][k]-p[i-1][j])+w*w);
31                 }
32             }
33         }
34         printf("%.6lf\n",Max(o[n][1],o[n][2]));
35     }
36     return 0;
37 }
posted @ 2012-08-27 19:25  Naix_x  阅读(148)  评论(0编辑  收藏  举报