[コケ]製作13-1
2803 ワード
1として作成
整数Xには、次の3つの演算があります.
1.Xを3で割って、3で割った.
2.Xを2で割り、2で割ります.
1を減らす.
ある整数N上で上記演算を選択し、1を生成しようとする.演算回数の最小値を使う問題を求めます.
X -> X/3
X -> X/2
X -> X-1
大きな問題->小さな問題の答えを利用する.
N>=2.
Nを3を2で割る優先順位で1にする.
この方法では正解が得られない.(反例10)
重要なのは、小さくなることができるすべての状況を確認することです!!
まずbottom-up法で解く.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int d[] = new int[n+1];
d[0]=1;
d[0]=1;
for(int i=2;i<=n;i++) {
d[i]=d[i-1]+1;
if(i % 2 ==0)
d[i]=Math.min(d[i], d[i/2]+1);
if(i % 3 ==0)
d[i]=Math.min(d[i], d[i/3]+1);
}
System.out.println(d[n]);
}
}
うん...トップダウン法で解くとタイムアウトしました.import java.util.*;
public class Main {
static int d[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
d = new int[n+1];
System.out.println(cal(n));
}
public static int cal(int n) {
if(n==1) return 0;
if(d[n]>0) return d[n];
d[n]=cal(n-1) +1;
if(n%3==0) {
d[n]=Math.min(d[n], cal(n/3)+1);
}
if(n%2==0) {
d[n]=Math.min(d[n], cal(n/2)+1);
}
return d[n];
}
}
理由は、、、数学です.min関数のためです.ほほほimport java.util.*;
public class Main {
public static int d[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
d = new int[n+1];
System.out.println(cal(n));
}
public static int cal(int n) {
if(n==1) return 0;
if(d[n]>0) return d[n];
d[n]=cal(n-1) +1;
if(n%3==0) {
int tmp=cal(n/3)+1;
if(d[n]>tmp) {
d[n]=tmp;
}
}
if(n%2==0) {
int tmp=cal(n/2)+1;
if(d[n]>tmp) {
d[n]=tmp;
}
}
return d[n];
}
}
これは崔伯俊先生のコードテストの基礎科目に基づいて書いた文章です.Reference
この問題について([コケ]製作13-1), 我々は、より多くの情報をここで見つけました https://velog.io/@tms01365/코테13-1로-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol