WA 0求助
查看原帖
WA 0求助
589961
steambird楼主2024/7/12 20:58
#include <bits/stdc++.h>
using namespace std;

inline void train() {
	   ios::sync_with_stdio(false);
	   cin.tie(0);
	   cout.tie(0);
}

constexpr int N = 103, M = 29, INF = 100003;
// Note: starting from 1.
int dp[N][N][M], dpsrc[N][N][M], n, m;
string cache = "";

char sched[N][M];

inline void calculate(int ending) {
	int latest_cost = INF-2, latest_pos = -1;	// -1: Not available.
	for (int i = 1; i <= m; i++) {
		if (sched[ending][i] == 'O') {
			latest_cost = 0;
			latest_pos = i;
			break;
		}
	}
//	cerr << "Ending at " << ending << " position " << latest_pos << endl;
	for (int i = ending-1; i >= 1; i--) {
//		for (int i = n-1; i >= 1; i--) {
			for (int j = 1; j <= m; j++) {
				if (sched[i][j] == 'X') {
					dp[ending][i][j] = INF+1;
					dpsrc[ending][i][j] = -1;
					continue;
				}
				int best_val = INF-5, best_from = -1;
				for (int k = 1; k <= m; k++) {
					int my_val;
					if (j == k) {
						my_val = dp[ending][i+1][k];
					} else {
						my_val = dp[ending][i+1][k] + 1;
					}
					if (my_val < best_val || (best_from == j && my_val == best_val)) {
						best_val = my_val;
						best_from = k;
					}
				}
				dp[ending][i][j] = best_val;
				dpsrc[ending][i][j] = best_from;
//				cerr << "Day " << i << " position " << j << " comes from " << dpsrc[ending][i][j] << endl;
			}
//		}
		
	}
}

int main() {

	train();
	
	cin>>n>>m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin>>sched[i][j];
			if (sched[i][j] == 'X') for (int k = 1; k <= n; k++) {
				dp[k][i][j] = INF;
				dpsrc[k][i][j] = -1;
			}
		}
	}
	
	for (int i = 1; i <= n; i++) calculate(i);
	
	int mx,nx,caseid = 1;
	bool initial = true;
	while (cin>>mx>>nx) {
		if (mx == 0 || nx == 0) break;
		if (initial) {
			initial = false;
		} else {
			cout << '\n';
		}
		nx--;
		// Get m latest
		int latest_cost = INF-2, latest_pos = -1;	// -1: Not available.
		for (int i = 1; i <= m; i++) {
			if (dp[nx][mx][i] < latest_cost) {
				latest_cost = dp[nx][mx][i];
				latest_pos = i;
			}
		}
		cout << "Case " << caseid << ":\n\n";
		if (latest_pos < 0) {
			cout << "Not available\n";
			caseid++;
			continue;
		}
//		cerr << "Day " << mx << " Select " << latest_pos << " at cost " << latest_cost << endl;
		cache = "";
		int tracker = dpsrc[nx][mx][latest_pos], former = mx;
		bool failed = false;
		for (int i = mx+1; i <= nx; i++) {
			if (tracker < 0) {
				cout << "Not available\n";
				failed = true;
				break;
			}
			if (tracker != latest_pos) {
				// Put away the former
//				cout << (latest_pos - 1 + 'A') << ": " << former << "-" << (i-1) << '\n';
				cache += latest_pos - 1 + 'A';
				cache += ": ";
				cache += to_string(former);
				cache += '-';
				cache += to_string(i);
				cache += '\n';
				latest_pos = tracker;
				former = i;
			}
//			cerr << "Day " << i << " Select " << tracker << endl;
			tracker = dpsrc[nx][i][latest_pos];
		}
		if (!failed) {
			cout << cache << char(latest_pos - 1 + 'A') << ": " << former << "-" << (nx+1) << '\n';
		}
		caseid++;
	}
	
	cout<<flush;

	return 0;
}

对题解对拍也拍不出来

2024/7/12 20:58
加载中...