김태원_알리바바와 40인의 도둑

풀이전략

  • 구현인가? 라는 생각을 했지만, 왼쪽, 위쪽을 보고 최소값을
    찾아내는 방법으로, 이전값 결과를 통해 결과를 도출해나가는 것이므로
    다이나믹 프로그래밍이라는 것을 생각할 수 있다.

  • 처음에는 구현으로 접근 + 문제를 이해하지 못한 상태로 접근해서
    못 풀었다.

끄적끄적

소스코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int main(void)
{
	int n;
	cin >> n;

	vector<vector<int>>v(n, vector<int>(n, 0));
	vector<vector<int>>dp(n, vector<int>(n, 0));
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> v[i][j];
		}
	}

	int result = v[0][0];
	//오른쪽으로만, 아래로만 

	for (int i = 1; i < n; i++)
	{
		v[0][i] += v[0][i - 1];
		v[i][0] += v[i - 1][0];
	}

	for (int i = 1; i < n; i++)
	{
		for (int j = 1; j < n; j++)
		{
			v[i][j] += min(v[i - 1][j], v[i][j - 1]);
		}
	}

	cout << v[n - 1][n -1];


}

2번째 소스코드

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;



int main()
{
	int n;
	cin >> n;

	vector<vector<int>>v(n + 1, vector<int>(n + 1, 0));

	for (int i = 1; i < n + 1; i++)
	{
		for (int j = 1; j < n + 1; j++)
		{
			cin >> v[i][j];
		}
	}

	for (int i = 1; i < n + 1; i++)
	{
		for (int j = 1; j < n + 1; j++)
		{
			if (v[i][j - 1] == 0)
			{
				v[i][j] += v[i - 1][j];
			}
			else if (v[i - 1][j] == 0)
			{
				v[i][j] += v[i][j - 1];
			}
			else 
			v[i][j] = v[i][j] + min(v[i - 1][j], v[i][j - 1]);
			
		}
	}

	cout << v[n][n];

}

좋은 웹페이지 즐겨찾기