import java.util.Scanner;

public class Main{

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int testCount = sc.nextInt();
		int dp [] = new int[12];
		int result[] = new int[testCount];
		for(int i=0;i<testCount;i++) {
			int testNum = sc.nextInt();
			dp[0]=0;
			for(int j=1;j<=testNum;j++) {
				if(dp[j]>0) {
					//중복 제거
					continue;
				}
				else if(j==1) dp[j] = 1;
				else if(j==2) dp[j] = 2;
				else if(j==3) dp[j] = 4;
				else dp[j] = dp[j-3] + dp[j-2] + dp[j-1];
			}
			result[i] = dp[testNum];
		}
		for(int i=0;i<result.length;i++) {
			System.out.println(result[i]);
		}
	}
}

'algorism' 카테고리의 다른 글

11727 2xn 타일링 2  (0) 2019.02.11
11726 2xn 타일링  (0) 2019.02.11
1463 1로 만들기  (0) 2019.02.11
11053 가장 긴 증가하는 부분 수열 java  (0) 2019.02.10
10844 쉬운 계단 수 java  (0) 2019.02.10
import java.util.Scanner;

public class Main{

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int dp [] = new int[n+1];
		dp[0] = 0;
		for(int i=1;i<=n;i++) {
			if(i==1) dp[i] = 1;
			else if(i==2) dp[i]=3;
			else {
				dp[i] = (dp[i-1] + (dp[i-2]*2))%10007;
			}
		}
		
		System.out.println(dp[n]);
	}
}

'algorism' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.02.11
11726 2xn 타일링  (0) 2019.02.11
1463 1로 만들기  (0) 2019.02.11
11053 가장 긴 증가하는 부분 수열 java  (0) 2019.02.10
10844 쉬운 계단 수 java  (0) 2019.02.10
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int dp[] = new int[n+1];
		dp[0] = 1;
		dp[1] = 2;
		for(int i=2;i<dp.length;i++) {
			dp[i] = dp[i-1]%10007 + dp[i-2]%10007;
		}
		System.out.println(dp[n-1]%10007);
	}

}

'algorism' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.02.11
11727 2xn 타일링 2  (0) 2019.02.11
1463 1로 만들기  (0) 2019.02.11
11053 가장 긴 증가하는 부분 수열 java  (0) 2019.02.10
10844 쉬운 계단 수 java  (0) 2019.02.10
import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int dp[] = new int[n+1];
		for(int i=2;i<dp.length;i++) {
			dp[i] = dp[i-1]+1;
			if(i%2==0) dp[i] = Math.min(dp[i/2]+1, dp[i]);
			if(i%3==0) dp[i] = Math.min(dp[i/3]+1, dp[i]);
		}
		System.out.println(dp[n]);
	}

}

'algorism' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.02.11
11727 2xn 타일링 2  (0) 2019.02.11
11726 2xn 타일링  (0) 2019.02.11
11053 가장 긴 증가하는 부분 수열 java  (0) 2019.02.10
10844 쉬운 계단 수 java  (0) 2019.02.10

<문제 해석>

부분 수열을 보면 마지막 값인 50부터 생각을 해보자.

지목한 값이 50일 경우 앞에 올 수 있는 가장 가까운 값은 30이다. 30일 경우 가장 가까운 값은 20이고, 20일 경우에 앞에 올 수 있는 값을 10이다.

즉, 50을 마지막 DP값이라고 생각했을 때, 30의 DP값을 이미 계산 되어 있다고 생각하면 쉽게 이해가 된다.

이중 for문을 구성하여 지목한 값과 그 전의 값들을 비교하여 값이 작으면 DP값을 비교하면서 전의 DP값이 큰것을 마지막 DP값으로 계속 넣어주면 되겠다.

수열의 최소 길이가 1이므로 DP배열의 값들을 1로 초기화한 후 아래와 같이 점화식을 구성하였다.

for(int i=0;i<6;i++){

 for(int j=0;j<i;j++){

  if(A[i]>A[j]){

   dp[i] = Math.max(dp[j]+1, dp[i])

  }

 }

}

이 점화식을 토대로 소스 코드를 구성해 보았다.

<소스코드>

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] arr = new int[n];
		int[] dp = new int[n];
		
		for (int i = 0; i < n; ++i) {
			arr[i] = sc.nextInt();
			//dp 값 1로 지정
			dp[i] = 1;
		}
		
		for(int i = 1; i < n; ++i){
			for (int j = 0; j < i; ++j){
				if (arr[i] > arr[j]){
					//앞의 숫자와 비교하여 작을 경우 전에 계산한 길이의 최대값을 dp에 넣어준다.
					//ex) 10, 14, 11, 12 의 케이스를 계산
					dp[i] = Math.max(dp[j] + 1, dp[i]);
				}
			}
		}

		Arrays.sort(dp);
		System.out.println(dp[n-1]);
	}

}


'algorism' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.02.11
11727 2xn 타일링 2  (0) 2019.02.11
11726 2xn 타일링  (0) 2019.02.11
1463 1로 만들기  (0) 2019.02.11
10844 쉬운 계단 수 java  (0) 2019.02.10

 

<문제 해석>

 예제를 보면 N에 1을 넣었을 때 9가 출력된다. N은 1자리일 경우 올 수 있는 계단 수 즉 1부터 9까지(0으로 시작하는 수는 없다고함) 총 9가지이다.

 그렇다면 2를 넣었을 경우를 생각해 보자.

 [N=1]

 각 자릿수별 1가지


 [N=2]

 앞자리가 1일 경우 10, 12 

 앞자리가 2일 경우 21, 23

 앞자리가 3일 경우 32, 34 ...

 앞자리가 8일 경우 87, 89

 앞자리가 9일 경우 98


 앞자리가 9일 경우를 제외하고 2가지


 [N=3] 

 101, 121, 123

 212, 210, 232, 234

 321, 323, 343, 345 ...

 878, 876, 898

 987, 989


 앞자리 1,8 -> 3가지

           9 -> 2가지

          나머지 ->4가지

 

 [N=4]

 1, 8 -> 6가지

 9 -> 3가지

 나머지 -> 7가지


 4까지 계산하게 되면 일정한 규칙을 찾을 수 있다. 

 앞자리가 2~7일 경우 -> 전 단계의 1,8일 경우의 갯수 + 2~7일 경우의 갯수

 앞자리가 1, 8 일 경우 -> 전 단계의 9일 경우의 갯수 + 2~7일 경우의 갯수 

 앞자리가 9일 경우 -> 전 단계의 1,8일 경우의 갯수

 

 규칙을 찾았으니 이제 점화식 구할 일만 남았다.

 점화식은 N값 별로 1부터 9까지의 자릿수의 케이스를 저장하기 위해 이중배열로 구성해야 한다.

 

 따라서 아래 코드와 같이 구성하여 보았다.

 주의할 점은 결과 값들에 대해 1000000000을 나눠주는 조건과 dp배열의 data type을 long타입으로 줘야 하는 것이다.


<소스코드>

import java.util.Scanner;

public class Beak10844 {

	public static void main(String[] args) {
		//LONG TYPE 주의 할것!!!
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		long dp[][] = new long[n+1][10];
		for(int i=0;i<=9;i++) {
			dp[1][i] = 1;
		}
		
		for(int i=2; i<=n; i++) {
			for(int j=0;j<10;j++) {
				if(j==0) dp[i][j] = dp[i-1][1]%1000000000;
				else if(j==9) dp[i][j] = dp[i-1][8]%1000000000;
				else dp[i][j] = (dp[i-1][j-1] + dp[i-1][j+1])%1000000000;
			}
		}
		long result=0;
		for(int i=1;i<10;i++) {
			result += dp[n][i];
		}
		System.out.println(result%1000000000);
		
	}

}


'algorism' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.02.11
11727 2xn 타일링 2  (0) 2019.02.11
11726 2xn 타일링  (0) 2019.02.11
1463 1로 만들기  (0) 2019.02.11
11053 가장 긴 증가하는 부분 수열 java  (0) 2019.02.10

+ Recent posts