UVA - 10131 Is Bigger Smarter?

题目大意:给出 n 只大象的属性, 包括重量 w, 智商 s, 现在要求找到一个连续的序列, 要求每只大象的重量比前一只的大, 智商却要小, 输出最长值和方案, 方案不唯一的时候任意输出一种


解题思路:DAG无定点的最长路问题, 记忆化搜索,并记录当前最有解的前驱


#include <cstdio>
#include <algorithm>
using namespace std;

struct Node {
	int w, s;
	int order, next;
} E[1005] = {0};

int cmp(Node a, Node b) {
		return a.w != b.w ? a.w < b.w : a.s > b.s;
}

int main() {
	int n, DP[1005];
	for (n = 1; scanf("%d%d", &E[n].w, &E[n].s) != EOF; E[n].order = n, n++);
	sort(E + 1, E + n, cmp);

	int temp, MAX = 0;
	for (int i = n - 1; i > 0; i--) {
		int m = 0;
		for (int j = i + 1; j < n; j++)
			if(E[j].w > E[i].w && E[j].s < E[i].s && DP[j] > m) {
				m = DP[j];
				E[i].next = j;
			}

		DP[i] = m + 1;
		if (DP[i] > MAX) {
			MAX = DP[i];
			temp = i;
		}
	}

	printf("%d\n", MAX);
	while (temp) {
		printf("%d\n", E[temp].order);
		temp = E[temp].next;
	}

	return 0;
}


你可能感兴趣的:(UVA - 10131 Is Bigger Smarter?)