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

 

你可能感兴趣的:(spider)