Algorithm ๐ง๐ป๐ป/๋ฐฑ์ค(BOJ)
[๋ฐฑ์ค,c++] 1309๋ฒ - ๋๋ฌผ์
dkswnkk
2022. 9. 27. 23:57
๋ฌธ์
1309๋ฒ: ๋๋ฌผ์
์ฒซ์งธ ์ค์ ์ฐ๋ฆฌ์ ํฌ๊ธฐ N(1โคNโค100,000)์ด ์ฃผ์ด์ง๋ค.
www.acmicpc.net
์ฝ๋
#include <iostream>
#define MOD 9901
using namespace std;
int dp[100001][3];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
dp[0][0] = 1; // ์ฌ์๋ฅผ ๋์ง์๋ ๊ฒฝ์ฐ
dp[0][1] = 1; // ์ฌ์๋ฅผ ์ผ์ชฝ์ ๋ฐฐ์นํ๋ ๊ฒฝ์ฐ
dp[0][2] = 1; // ์ฌ์๋ฅผ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์นํ๋ ๊ฒฝ์ฐz
int N; cin>>N;
for(int i=1; i<N; i++){
dp[i][0] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2]) % MOD;
dp[i][1] = (dp[i-1][0] + dp[i-1][2]) % MOD;
dp[i][2] = (dp[i-1][0] + dp[i-1][1]) % MOD;
}
cout<<(dp[N-1][0] + dp[N-1][1] + dp[N-1][2]) % MOD;
}
ํ์ด
DP๋ฌธ์ ์ ๋๋ค. ์ฝ๋์ ์ฃผ์์๋ ์ ํ ์๋ฏ์ด, ๋ฐฐ์ด์ ์๋์ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
- dp[index][0]: ํด๋น ์นธ์ ์ฌ์๋ฅผ ๋์ง ์์๋ ์ง๊ธ๊น์ง ์ ํ ํ ์ ์๋ ์ด ๊ฒฝ์ฐ์ ์
- dp[index][1]: ํด๋น ์นธ์ ์ผ์ชฝ์ ์ฌ์๋ฅผ ๋์์๋ ์ง๊ธ๊น์ง ์ ํ ํ ์ ์๋ ์ด ๊ฒฝ์ฐ์ ์
- dp[index][2]: ํด๋น ์นธ์ ์ค๋ฅธ์ชฝ์ ์ฌ์๋ฅผ ๋์์๋ ์ง๊ธ๊น์ง ์ ํ ํ ์ ์๋ ์ด ๊ฒฝ์ฐ์ ์
๊ทธ ๋ค, ์๋์ ๊ฐ์ด ๋ฐ๋ณต๋ฌธ์ ๋๋ ค ๊ณ์ฐํฉ๋๋ค.
- dp[i][0] = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2]) % MOD;
- ํ์ฌ ์นธ์ ์ฌ์๋ฅผ ๋์ง ์๋ ์ด ๊ฒฝ์ฐ์ ์ = (์ด์ ์นธ์ ์ฌ์๋ฅผ ๋์ง์๋ ์ด ๊ฒฝ์ฐ์ ์ + ์ด์ ์นธ์ ์ผ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ์ด ๊ฒฝ์ฐ์ ์ + ์ด์ ์นธ์ ์ค๋ฅธ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ์ด ๊ฒฝ์ฐ์ ์)
- dp[i][1] = (dp[i-1][0] + dp[i-1][2]) % MOD;
- ํ์ฌ์นธ์ ์ผ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ์ด ๊ฒฝ์ฐ์ ์ = (์ด์ ์นธ์ ์ฌ์๋ฅผ ๋์ง ์๋ ์ด ๊ฒฝ์ฐ์ ์ + ์ด์ ์นธ์ ์ค๋ฅธ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ์ด ๊ฒฝ์ฐ์ ์)
- dp[i][2] = (dp[i-1][0] + dp[i-1][1]) % MOD;
- ํ์ฌ์นธ์ ์ค๋ฅธ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ์ด ๊ฒฝ์ฐ์ ์ = (์ด์ ์นธ์ ์ฌ์๋ฅผ ๋์ง ์๋ ์ด ๊ฒฝ์ฐ์ ์ + ์ด์ ์นธ์ ์ผ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ์ด ๊ฒฝ์ฐ์ ์)
๊ทธ ๋ค, ์ด ๊ฒฝ์ฐ์ ์ = (ํ์ฌ ์นธ์ ์ฌ์๋ฅผ ๋์ง ์๋ ๊ฒฝ์ฐ + ํ์ฌ ์นธ์ ์ผ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ๊ฒฝ์ฐ + ํ์ฌ์ ์ค๋ฅธ์ชฝ์ ์ฌ์๋ฅผ ๋๋ ๊ฒฝ์ฐ)๋ฅผ ์ถ๋ ฅํฉ๋๋ค.