⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1029.c

📁 平时acm训练时ac的源代码
💻 C
字号:
#include <stdio.h>
#include <limits.h>

int M, N;
int fee[101][501];
int D[501];
int pre[101][501];
int path[101*501];
int pt_path;

main ()
{
	int i, j;

	scanf("%d %d", &M, &N);
	for (i = 1; i <= M; ++i) {
		for (j = 1; j <= N; ++j) scanf("%d", &fee[i][j]);
	}

	for (i = 2; i <= M; ++i) {
		for (j = 1; j <= N; ++j) {
			D[j] += fee[i-1][j];
			pre[i][j] = j;
		}

		int b;
		do {
			b = 0;
			for (j = 2; j <= N; j++) {
				if (D[j] > D[j-1] + fee[i][j-1]) 
				{
					D[j] = D[j-1] + fee[i]
[j-1];
					pre[i][j] = j-1;
					b++;
				}
			}
			for (j = N-1; j >= 1; --j) {
				if (D[j] > D[j+1] + fee[i][j+1])
				{
					D[j] = D[j+1] + fee[i]
[j+1];
					pre[i][j] = j+1;
					b++;
				}
			}
		}while(b != 0);
	}
	
	for (j = 1; j <= N; ++j) {
		D[j] += fee[i-1][j];
	}

	int min = INT_MAX;
	int pt_j;
	int pt_i = M;
	
	for (j = 1; j <= N; ++j) {
		if (D[j] < min) {
			min = D[j];
			pt_j = j;
		}
	}

	pt_path = 0;
	do {
		pt_path++;
		path[pt_path] = pt_j;
		if (pre[pt_i][pt_j] == pt_j) pt_i--;
		else {
			pt_j = pre[pt_i][pt_j];
		}
	}while (pre[pt_i][pt_j] != 0);
	if (M != 1) printf("%d\n", pt_j);
	for (i = pt_path; i > 0; --i) printf("%d\n", path[i]);
}

⌨️ 快捷键说明

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