題解西電OJ (Problem 1003 -最喜歡的數字)--動態規劃

Descriptionios

         zyf最喜歡的數字是1!因此他常常會使用一些手段,把一些非1的數字變 成1,併爲此得意不已。他會且僅會的兩種手段是: 
1.把某個數m除以某個質數p——固然p必須能整除這個數,即m=m/p 
2.把某個數m減1,即m=m-1 
有一天他突發奇想,想把[a,b]區間中全部的數一個一個地變成1,這是一個巨大的無聊的工程,因此他想知道他最少得花多少操做才能達到目 的。
算法

Input
  輸入包含多組數據(1000組數據),EOF結束。
  每組數據以兩個整數開頭:a,b(0<a<=b<=100000),意義如題意描述。
Output
  每組數據輸出一行,最少操做數。
Sample Input
2 3
3 5
11 12
Sample Output
2
4
3
 
解題思路:
假設一個數字A的最少操做次數爲 res[A], 且能夠被 S1,S2....Sk。K個素數整除,那麼res[A] = min{res[A-1],res[A/S1],res[A/S2] ... ,res[A/Sk]} + 1
那麼咱們能夠獲得遞歸的解,可是遞歸的解決這個問題會有不少次重複計算,好比說res[36] 咱們須要計算res[36/3] = res[12] 的結果,res[12]又要求計算res[12/2] = res[6]的結果, 要知道res[36]還須要計算res[36/2]=res[18] 的結果,而計算res[18]須要計算 res[18/3]=res[6] 的結果,所以res[6]須要兩次被計算,res[2]和 res[3],須要被更屢次計算。
那麼爲了不重複的計算,咱們使用動態規劃算法,先求出100000之內的素數表,從1開始,每一個逐個計算,由於res[1] = 0 ;res[i*全部素數] = 1;所以,計算res[i]的時候,經過比較以前素數相乘獲得的結果,以及res[i-1]+1的結果進行更新,就能獲得res[i]的值。
 
代碼以下:
 1 #include <iostream>
 2 #include "math.h"
 3 using namespace std ;
 4 
 5     int res[100001] ;
 6     bool sieve[100001] = {0};
 7     int prime[10000] ;
 8 
 9 int main()
10 {
11 
12 
13     int a,b,i,j,k;
14     int prime_length = 0 ;
15     for( i = 2 ; i < 100001 ; i++){ // get prime list
16         if(sieve[i] == false){
17             prime[prime_length++] = i ;
18             res[i] = 1 ;
19             for( j = 2 ; j * i <= 100000 ; j++){
20                 sieve[i*j] = true;
21             }
22         }
23     }
24     res[0] = res[1] =0 ;
25     res[2] = res[3] = 1 ;
26     for(i = 2 ; i < 100001 ; i++ ){   //DP get res[num]
27         if(res[i] == 0 || res[i-1] < res[i]-1 ){
28             res[i] = res[i-1] + 1 ;
29         }
30         for(j = 0 ; j < prime_length && i * prime[j] < 100001 ; j++){
31             if(res[i*prime[j]] == 0 || (res[i]+1) < res[i*prime[j]]){
32                 res[i*prime[j]] = res[i] + 1;
33             }
34         }
35     }
36 
37     while(cin>>a>>b){
38 
39     
40         j = 0;
41         for(i = a ; i <= b ;i++){
42             j += res[i] ;
43         }
44         cout << j << endl;
45     }
46 }
相關文章
相關標籤/搜索