4112377_mle.cc

来自「北大大牛代码 1240道题的原代码 超级权威」· CC 代码 · 共 80 行

CC
80
字号
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int fee[2][500];
int dp[2][500];
short prev[100][500];
vector <short> ans;

int main()
{
	short n, m;
	short i, j;
	short p, q;

	scanf("%d%d", &n, &m);
	for (i = 0; i < m; i++)
	{
		scanf("%d", &fee[0][i]);
		dp[0][i] = fee[0][i];
		prev[0][i] = -1;
	}
	p = 1;q = 0;
	for (i = 1; i < n; i++, p = !p, q = !q)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &fee[p][j]);
		}
		for (j = 0; j < m; j++)
		{
			dp[p][j] = dp[q][j] + fee[p][j];
			prev[i][j] = j;
		}
		int tmp;
		for (j = 1; j < m; j++)
		{
			tmp = dp[p][j - 1] + fee[p][j];
			if (dp[p][j] > tmp)
			{
				dp[p][j] = tmp;
				prev[i][j] = j - 1;
			}
		}
		for (j = m - 2; j >= 0; j--)
		{
			tmp = dp[p][j + 1] + fee[p][j];
			if (dp[p][j] > tmp)
			{
				dp[p][j] = tmp;
				prev[i][j] = j + 1;
			}
		}
	}
	ans.clear();
	int min = 2000000000;
	int st;
	for (i = 0; i < m; i++)
	{
		if (dp[q][i] < min)
		{
			min = dp[q][i];
			st = i;
		}
	}
	int row = n - 1;
	while (st != -1)
	{
		ans.push_back(st + 1);
		if (st == prev[row][st])
			row--;
		else
			st = prev[row][st];
	}
	for (i = ans.size() - 1; i >= 0; i--)
		printf("%d\n", ans[i]);
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?