λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ 문제 풀이/DP

[λ°±μ€€]10844번: μ‰¬μš΄ κ³„λ‹¨μˆ˜

by syLim___ 2023. 2. 11.
728x90

https://www.acmicpc.net/problem/10844

 

10844번: μ‰¬μš΄ 계단 수

첫째 쀄에 정닡을 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

www.acmicpc.net


 

dp문제!

 

i \ j 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 2                
                   

dp[i][j]μ—μ„œ iλŠ” 자릿수λ₯Ό, jλŠ” μ‹œμž‘ 숫자λ₯Ό μ˜λ―Έν•œλ‹€.

μ˜ˆμ‹œ - dp[2][4] : 4둜 μ‹œμž‘ν•˜λŠ” 2자리 숫자. 총 2개 (43,45)

 

1) ν•œμžλ¦¬ μˆ«μžλŠ” λͺ¨λ‘ κ³„λ‹¨μˆ˜

 

2) n자리 숫자

  • 1둜 μ‹œμž‘

 - 10xxxx... , 12xxxx... 두가지 경우 κ°€λŠ₯

 - μ „μžμ˜ 경우, κ³„λ‹¨μˆ˜λ₯Ό λ§Œλ“œλ €λ©΄ 101xxxx... κ°€ λ˜μ–΄μ•Ό 함

 - λ”°λΌμ„œ 경우의 μˆ˜λŠ” 1둜 μ‹œμž‘ν•˜λŠ” n-2자리 숫자의 개수인데 이 값이 dp[i-2][0]μž„

 

 - ν›„μžμ˜ 경우의 μˆ˜λŠ” 2둜 μ‹œμž‘ν•˜λŠ” n-1자리 숫자의 개수인데 이 값은 dp[i-1][1]μž„

 

 - λ”°λΌμ„œ 1둜 μ‹œμž‘ν•˜λŠ” n자리 숫자의 κ³„λ‹¨μˆ˜λŠ” dp[i][0] = dp[i-2][0] + dp[i-1][1]

 

 - λ‘μžλ¦¬ 숫자일 경우, 1둜 μ‹œμž‘ν•˜λŠ” 0자리 숫자 λͺ»κ΅¬ν•œλ‹€. λ”°λΌμ„œ 이 κ²½μš°μ—λ§Œ λ”°λ‘œ κ΅¬ν•΄μ„œ μ±„μ›Œμ€€λ‹€.

 - 1둜 μ‹œμž‘ν•˜λŠ” λ‘μžλ¦¬ 숫자의 κ³„λ‹¨μˆ˜λŠ” 10, 12 두가지가 κ°€λŠ₯ν•˜λ―€λ‘œ 2이닀

  • 2~8둜 μ‹œμž‘

 - dp[i][j] = dp[i-1][j-1] + dp[i+1][j+1]

  • 9둜 μ‹œμž‘

 - 98xxxx... 만 κ°€λŠ₯. λ”°λΌμ„œ dp[i][j] = dp[i-1][7]

 

 

#include <iostream>
using namespace std;

int main(){
	int c = 1000000000;

	int n; cin>>n;
	int dp[n][9];
	for(int i=0;i<9;i++) dp[0][i]=1;
	
	for(int i=1;i<n;i++){
		for(int j=0;j<9;j++){
			if(j==0) { 
				if(i==1) dp[i][j]=2;
				else dp[i][j]=((dp[i-2][0]%c)+ (dp[i-1][1]%c))%c;}
			else if(j==8) dp[i][j] = dp[i-1][7]%c;
			else dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])%c;
		}
	}
	
	int sum=0;
	for(int i=0;i<9;i++) sum=(sum+dp[n-1][i])%c;
	cout<<sum%c;
	return 0;
}
728x90