problem solving

백준 23325: 마법천자문

finding wangdo 2023. 3. 4. 00:43

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

 

23325번: 마법천자문

최근最近 만화漫畫 마법천자문魔法千字文을 감명感銘 깊게 읽은 연두然斗는, 모든 수數를 한자漢字로 적기 시작始作했다. 그런데 수업授業을 들으면서 필기筆記 해놓은 내용內容을 복습復習

www.acmicpc.net

 

전형적인 DP문제다.

요즘 너무 DP만 푸는거 같긴 하다.

진짜 비정상

 

 

계단 문제랑 비슷한 원리다.

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

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

 

문자열 s의 0번째부터 i번째 문자까지 보았을 때 답을 dp[i]라고 둔다.

i번째 문자까지 본 문자열이

....+-로 끝나면 그 전 문자열의 값에 +1이 된 것으로 해석

....--로 끝나면 그 전 문자열의 값에 -1이 된 것으로 해석

....++로 끝나면 그 전 문자열의 값에 +10이 된 것으로 해석

....-+로 끝나면 그 전 문자열의 값에 -10이 된 것으로 해석

....++-로 끝나면 그 전 문자열의 값에 +11이 된 것으로 해석

....-+-로 끝나면 그 전 문자열의 값에 -11이 된 것으로 해석

가능하다.

그러니까 어떤 식으로 끝나는지를 조사해 나올 수 있는 모든 해석 가능성들 중 가장 큰 값을 dp[i]에 저장하면 된다.

어떤 방법으로도 해석이 불가한 경우는 dp[i]값에 -2000000000(마이너스 20억)을 저장하는 것으로 했다.

 

다음은 C언어로 구현한 것이다.

int main()
{
	char s[200006];
	scanf("%s", s);
	int dp[200006];
	int k = strlen(s);
	dp[0] = s[0] == '+' ? 10 : 1;
	if (s[0] == '+' && s[1] == '-')
		dp[1] = 11;
	else
		dp[1] = -2000000000;
	int a3 = s[0] == '+' ? 10 : 1;
	int b3 = s[2] == '+' ? 10 : 1;
	if (s[1] == '+')
		dp[2] = a3 + b3;
	else
		dp[2] = a3 - b3;

	for (int i = 3;i < k;i++)
	{
		int p = -2000000000;
		if (s[i] == '+')
		{
			if (s[i - 1] == '+')
			{
				if (dp[i - 2] != -200000000)
					p = max(p, dp[i - 2] + 10);
			}
			else
			{
				if (dp[i - 2] != -200000000)
					p = max(p, dp[i - 2] - 10);
			}
		}
		else
		{
			if (s[i - 1] == '+')
			{
				if (dp[i - 2] != -200000000)
					p = max(p, dp[i - 2] + 1);
				if (s[i - 2] == '+')
				{
					if (dp[i - 3] != -200000000)
						p = max(p, dp[i - 3] + 11);
				}
				else
				{
					if (dp[i - 3] != -200000000)
						p = max(p, dp[i - 3] - 11);
				}
			}
			else
			{
				if (dp[i - 2] != -200000000)
					p = max(p, dp[i - 2] - 1);
			}
		}
		dp[i] = p;
	}
	printf("%d", dp[k - 1]);
}

'problem solving' 카테고리의 다른 글

백준 23032: 서프라이즈~  (0) 2024.11.17
백준 13018: 특이한 수  (1) 2023.03.06
백준 15011: Irrational Division  (1) 2023.03.01
백준 4342: 유클리드 게임  (0) 2023.02.28
백준 11565: 바이너리 게임  (0) 2023.02.24