跳石板——动态规划

  1. #include<iostream>  
  2. #include<vector>  
  3. #include<math.h>  
  4.   
  5. using namespace std;  
  6. void calYueshu(int n,vector<int> &yueshu);  
  7.       
  8. int main()  
  9. {  
  10.     int N,M;  
  11.     cin>>N>>M;  
  12.     vector<int> steps(M+1,0);  
  13.     steps[N]=1;  
  14.       
  15.     for(int i=N;i<=M;++i){  
  16.         if(steps[i]==0)continue;   //位置无法到达,跳过  
  17.         vector<int> yueshu;  
  18.         calYueshu(i,yueshu);  
  19.         for(int j=0;j<yueshu.size();++j){  //记录从起点N到位置i的最小步数  
  20.             if(yueshu[j]+i<=M){  
  21.                 if(steps[yueshu[j]+i]==0)    //到达位置i的最小步数加1  
  22.                     steps[yueshu[j]+i]=steps[i]+1;  
  23.                 else                         //其它点也能到达,比较大小,记录最小步数  
  24.                     steps[yueshu[j]+i]=(steps[i]+1)<steps[yueshu[j]+i]?(steps[i]+1):steps[yueshu[j]+i];  
  25.             }  
  26.         }    
  27.     }  
  28.       
  29.     if(steps[M]==0)  
  30.         cout<<-1<<endl;  
  31.     else  
  32.         cout<<steps[M]-1<<endl;  
  33.     return 0;     
  34. }  
  35.   
  36. //求约数  
  37. void calYueshu(int n,vector<int> &yueshu){  
  38.     for(int i=2;i<=sqrt(n);++i){  
  39.         if(n%i==0){  
  40.             yueshu.push_back(i);  
  41.             if(n/i != i)  
  42.                 yueshu.push_back(n/i);  
  43.         }     
  44.     }           
  45. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值