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 }