1003: 피보나치 count
- 피보나치를 재귀를 활용하면 2^n이지만 dp를 사용하면 o(n)에 끝낼 수 있다
-> 재귀를 하나 들어갈때마다 값이 결정된다.
재귀를 n번들어가면 n개의 값이 결정되고, 그렇기때문에 o(n)에 풀수있다
이 문제는 2^40이 되면 시간초과가 나기때문에 dp를 사용해야한다
import java.io.*;
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.Arrays;
public class Main{
static int fibo[];
static final int MAX_SIZE=41;
public static int fibonacci(int n){
if(fibo[n]!=-1) {
return fibo[n];
}
fibo[n] = fibonacci(n-1) + fibonacci(n-2);
return fibo[n];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int arr[] = new int[n];
fibo = new int[MAX_SIZE];
for(int i=0;i<fibo.length;i++){
fibo[i] = -1;
}
fibo[0] = 0;
fibo[1] = 1;
fibonacci(MAX_SIZE-1);
for(int i=0;i<n;i++){
arr[i] = Integer.parseInt(br.readLine());
if(arr[i]==0) bw.write("1 0\n");
else if(arr[i]==1) bw.write("0 1\n");
else bw.write(fibo[arr[i]-1] + " " +fibo[arr[i]] + "\n");
}
bw.flush();
bw.close();
}
}
1912: 연속합
import java.io.*;
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.Arrays;
public class Main{
public static int solve(int arr[]){
int dp[] = new int[arr.length];
int max = arr[0];
dp[0] = arr[0];
for(int i=1;i<arr.length;i++){
dp[i] = Math.max(dp[i-1]+arr[i], arr[i]);
max = Math.max(dp[i], max);
}
return max;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int arr[] = new int[n];
String input[] = br.readLine().split(" ");
for(int i=0;i<n;i++){
arr[i] = Integer.parseInt(input[i]);
}
bw.write(solve(arr)+"");
bw.flush();
bw.close();
}
}