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 }