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 }

你可能感兴趣的:(dp)