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

 

转载于:https://www.cnblogs.com/shangyu/p/3325218.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值