algorithm - Multiply/add initial number to get target number -


suppose have target number n e.g. 5, , start number 1 , have *2 or *3 or +1 until reach n. in case *2 twice, +1 5.

i supposed find least number of operations reach target value. see similar question being posted requires fixed number of steps while have figure out least steps. there tips on how can tackle problem?

this homework problem.

it can regarded search or dp problem (yes in essence both related state transition), key point define search state condition, suppose n positive, here define f[i] = inf, inf large integer means number i not reachable, f[i] = k, k >= 0 means number i can reached in @ least k steps.

if n not large, can use array store least steps each number 1 n. initial f[1] = 0 , f[i] = inf, 2 <= <= n. if need output how target(ex, output of 5 1 2 4 5), can use array pre store operations, define pre[i] = j means number i produced number j(ex, pre[4] = 2 means number 4 produced number 2, because 2*2=4; pre[3] = 1 means number 3 produced number 1, because 1*3=3):

    int inf = integer.max_value;     f[1] = 0;     pre[1] = -1; // pre[i] = -1 means start point     for(i=2;i<=n;i++) {         f[i] = inf;         pre[i] = -1;     }      for(int i=1;i<=n;i++) { // since each number positive smaller number cannot produced via larger number, no need consider > n issue         if(f[i] == inf) {             continue;         }         if(2*i <= n && f[i] + 1 < f[2*i]) {             f[2*i] = f[i] + 1;             pre[2*i] = i; // means number 2*i produced number         }         if(3*i <= n && f[i] + 1 < f[3*i]) {             f[3*i] = f[i] + 1;             pre[3*i] = i;         }         if(i+1 <= n && f[i] + 1 < f[i+1]) {             f[i+1] = f[i] + 1;             pre[i+1] = i;         }     } 

the answer f[n].

how output how target, use pre array recover operations:

        curr = n;         pos = 0;         ans[pos] = n;         while(pre[curr] != -1) {             pos++;             ans[pos] = pre[curr];             curr = pre[curr];         }         for(int i=pos;i>=0;i--) { // reverse order output             system.out.println(ans[i]);         } 

while if n large, may need use priority queue maintain state transition , hash set maintain least steps each number.


Comments

Popular posts from this blog

node.js - Using Node without global install -

How to access a php class file from PHPFox framework into javascript code written in simple HTML file? -

java - Null response to php query in android, even though php works properly -