Input The input file will contain multiple test cases. Each test case will begin with a single line containing a single integer n (where 2 <= n <= 100000). The next line will contain a list of integers x 1,x 2,…, x n where 0 <=x 1,x 2,…, x n<= 1000000. The end-of-fi le is denoted by a single line containing "0".
Output For each input test case, print the minimum total number of jumps needed for both players such that either Jack or Jill reaches the destination, or -1 if neither can reach the destination.
Sample Input
6 3 5 9 12 15 17 6 3 5 9 12 30 40
3
-1
用DP[i][j]表示:第一个人到了I点距离第二个人j的最小步数。dp[i][j]=min{dp[j][k]+1}.#include
#include
#include
#include
#include
typedef long long LL; using namespace std; const int INF=0x3f3f3f; const int maxn=1e5+100; int dp[maxn][15]; int hash[10*maxn]; int num[maxn],n; int main() { while(~scanf("%d",&n)&&n) { memset(dp,INF,sizeof(dp)); memset(hash,-1,sizeof(hash)); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); hash[num[i]]=i; } dp[2][num[2]-num[1]]=0; for(int i=2;i<=n;i++) { for(int j=1;j<=10;j++) { if(j>num[i]) break; for(int k=j+1;k<=10;k++) { int tt=num[i]-j; if(hash[tt]>=0) dp[i][j]=min(dp[hash[tt]][k-j]+1,dp[i][j]);//距离小于10的前面点中递推 } } } int ans=INF; for(int i=1;i<=10;i++) // { // cout<<"1111 "<