私は動的アルゴリズムの問題があり、私はそれをほぼ解決しました。問題は、私は1を加え、2を掛け、3を乗算する演算しかできないプリミティブな計算機を持っているということです。私は任意の数になるために必要な最小ステップ数を見つけなければなりません。私は問題を正しく実装しましたが、nにつながる数字の配列を出力する必要もあります。つまり、n = 5の場合、ステップは1,2,4,5で3ステップを要したので3を出力する必要があります。私のアルゴリズムは最小限のステップ数を見つけるのに有効ですが、配列を見つけることはできません。私は終わりから始まる分割と征服のアルゴリズムがうまくいくかもしれないと思っていますが、分裂と征服は良くありません。ここに私のコードです。配列全体(nにつながる要素ではなく、すべての要素)を出力します。動的プログラミングで配列内の要素を連結する方法(java)
public static int min(int a, int b){if(a>b){return b;}else{return a;}}
public static int min(int a, int b, int c){return min(min(a, b), c);}
public static int[] primitiveCalc(int n){
int[] solution=new int[n];
solution[0]=0;
solution[1]=0;
for(int i=2;i<n;i++){
if(i%3==0){
if(i%2==0){solution[i]=min(solution[i-1]+1, solution[i/3]+1, solution[i/2]+1);}
else{solution[i]=min(solution[i-1]+1, solution[i/3]+1);}
}else if(i%2==0){solution[i]=min(solution[i-1]+1, solution[i/2]+1);}
else{solution[i]=solution[i-1]+1;}
}
System.out.println(solution[n-1]);
return solution;
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] solution=primitiveCalc(n+1);
for(int i=1;i<solution.length;i++){
System.out.print(solution[i]+" ");
}
}
ご了承ください。誰もが興味を持っている場合、私は解決策を持って
は、ここに実装したものです:
私はそこにいることを知っているpublic static int[] findChainArray(int[] array, int n){
int[] chainedArr=new int[array.length];
for(int i=array.length-1, j=0;i>0;j++){
if(i%3==0) {
if (i % 2 == 0) {
if (min(array[i - 1], array[i/2], array[i/3]) == array[i - 1]) {
i = i - 1;
} else if (min(array[i - 1], array[i/2], array[i/3]) == array[i/2]) {
i = i/2;
} else {
i = i/3;
}
}else{
if (min(array[i - 1], array[i/3]) == array[i - 1]) {
i = i - 1;
} else {
i = i/3;
}
}
}else if(i%2==0){
if (min(array[i - 1], array[i/2]) == array[i - 1]) {
i = i - 1;
} else if (min(array[i - 1], array[i/2]) == array[i/2]) {
i = i/2;
}
}else{
i=i-1;
}
chainedArr[j]=i;
}
return chainedArr;
}
elseとIL試みは、今で
感謝!これは私が心に留めていた解決策ですが、私は分裂と征服をしていると考えていました。私はそれを繰り返し使用し、それは働いた。誰かがそれを必要とするならば、問題に解決策を追加してください。 – SKhurana