poj1925Spiderman(dp)

链接

确实是破题 按复杂度估计怎么着也不能按坐标D 啊

网上的代码交上去还TLE 无语了  多次TLE之后终于看到一次WA。。好高兴

以横坐标进行DP dp[j] = min(dp[j],dp[2*x[i]-j]+1) 这个2*x[i]-j其实是 j+2*(x[i]-j]) 由当前坐标可以由没跳这个个建筑物i之前的坐标推来

限制条件为 (j-x[i])*(j-x[i])+(y[i]-y[1])*(y[i]-y[1])>y[i]*y[i];

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<stdlib.h>
 7 using namespace std;
 8 #define N 5010
 9 #define M 2000010
10 #define INF 0xfffffff
11 #define LL long long
12 int dp[M];
13 LL x[N],y[N];
14 int main()
15 {
16     int i,j,k,n;
17     scanf("%d",&k);
18     while(k--)
19     {
20         scanf("%d",&n);
21         for(i = 1; i <= n ; i++)
22         scanf("%lld%lld",&x[i],&y[i]);
23         for(i = 0; i <= M ; i++)
24         dp[i] = INF;
25         dp[x[1]] = 0;
26         int ans = INF;
27         for(i = 2 ; i <= n ; i++)
28         {
29             LL s1 = (y[i]-y[1])*(y[i]-y[1]);
30             for(j = x[i] ; ; j++)
31             {
32                 LL s2 = (j-x[i])*(j-x[i]);
33                 if(s2+s1>y[i]*y[i])
34                 {
35                     break;
36                 }
37                 if(2*x[i]-j>=x[1])
38                 dp[j] = min(dp[2*x[i]-j]+1,dp[j]);
39                 else
40                 break;
41                 if(j>=x[n])
42                 ans = min(ans,dp[j]);
43             }
44         }
45         if(ans==INF)
46         printf("-1\n");
47         else
48         printf("%d\n",ans);
49     }
50     return 0;
51 }
View Code

 

posted @ 2013-09-16 20:56  _雨  阅读(193)  评论(0编辑  收藏  举报