/** * Dette programmet besvarer følgende problemstilling: * * Gitt et tall n * Hvor mange operasjoner trengs for å generere n fra 1, * når operasjonene *2, +1 og -1 er tillatte? * * Forklart mer utførlig: * Man begynner med x=1 * Følgende operasjoner er tilgjengelige: * x = 2*x * x = x+1 * x = x-1 * Hvor mange operasjoner trengs for å oppnå x=n? */ import java.io.*; import java.util.*; class Memoisering { BufferedReader inn = new BufferedReader(new InputStreamReader(System.in)); // Alle beregnede verdier lagres her: HashMap hm = new HashMap(); void leggTil(int n, int k) { hm.put(new Integer(n), new Integer(k)); } int finn(int n) { Integer o = (Integer)hm.get(new Integer(n)); if (o == null) { return -1; } return o.intValue(); } int solve(int n) { int lagret = finn(n); if (lagret != -1) { return lagret; } // n er ikke allerede beregnet: int svar; if (n%2 == 0) { svar = 1+solve(n/2); } else { int alt1 = solve(n-1); int alt2 = solve(n+1); svar = Math.min(alt1, alt2) + 1; } leggTil(n, svar); return svar; } Memoisering() { leggTil(1,0); while (true) { try { int n = Integer.parseInt(inn.readLine()); System.out.println("Svar: " + solve(n)); System.out.println("Antallet beregnede verdier: " + hm.size()); System.out.println(); } catch (Exception e) { // e.printStackTrace(); } } } public static void main(String[] args) { new Memoisering(); } }