AOJ.870 MAX 的读书计划


Time Limit: 1000 ms   Memory Limit: 50 MB
Total Submission: 8   Submission Accepted: 3
Judge By Case
Description
MAX 很喜欢读书,为了安排自己的读书计划,他会预先把要读的内容做好标记, A B 表
示一个页段,即第 A 到 B 面,当然 A 他就可以一次看完,现在告诉你 n 个页段,请你帮他求出最长的一条页段,并输出这条页段
的长度和组成它的页段个数。举个例子:
有 6 个页段:
2-7 1-3 3-12 12-20 7-10 4-50
那么连续的页段就有:
1-3, 3-12, 12-20 长度为 20-1+1=20 由 3 个页段组成
2-7, 7-10 长度为 10-2+1=9 由 2 个页段组成
4-50 长度为 50-4+1=47 由 1 个页段组成
那么最长的一条就是第三个,所以结果为 47 1。
需要注意的是:如果有两条不一样的连续的页段长度同时为最大,那么取组成页段数多
的一条.
例子: 1-5,5-10,1-10
输出: 10 2

Input
文件的第一行为一个整数 n, n<500;
第二行到第 n+1 行,每行两个整数 A B,记录一个页段的信息。 0<=A
Output
输出一个整数,即最长的页段的长度和组成它的页段数。

Sample Input
Original Transformed
7
1 5
10 12
3 10
2 7
2 10
12 16
7 9
7[EOL] 
1[SP]5[EOL] 
10[SP]12[EOL] 
3[SP]10[EOL] 
2[SP]7[EOL] 
2[SP]10[EOL] 
12[SP]16[EOL] 
7[SP]9[EOF] 

Sample Output
Original Transformed
15 3
15[SP]3[EOL] 
[EOF] 

Hint
1-5 长度为 5 由 1 个页段组成
3-10,10-12,12-16 长度为 14 由 3 个页段组成
2-7,7-9 长度为 8 由 2 个页段组成
2-10,10-12,12-16 长度为 15 由 3 个页段组成
所以输出最长的页段的长度即 15 由 3 个页段组成

【数据规模】
对于 30%的数据
n<20
0<=A 对于 100%的数据
n<500
0<=A 


#include
#include
#include
#include
#include
#include
#include
//#define DEBUG

using namespace std;
const int maxn = 550, INF = 1e9 + 1;
int a[maxn][maxn],d[maxn];
//d[i]表示到i的最长路
int main(){
#ifdef DEBUG
	freopen("Text.txt", "r", stdin);
#endif // DEBUG
	int n, i, j,end=0, ans1 = 0, ans2,path[maxn];
	scanf("%d", &n);
	
	for (i = 1; i <= n; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		a[x][y] = y - x + 1;
		end = max(end, y);
	}
	memset(d, 0, sizeof(d));
	memset(path, 0, sizeof(path));
	for (i = 0; i <= end; i++) {
		for (j = 0; j < i; j++) {
			if (a[j][i]) {
				if (d[j] != 0) {
					if (d[i] < d[j] + a[j][i]) {
						d[i] = d[j] + a[j][i] - 1;
						path[i] = j;
					}
				}
				else {
					d[i] = max(d[i], a[j][i]);
				}

			}

		}
	}
	//求最长路
	int a,b;
	ans2 = 1;
	for (i = 0; i <= end; i++) {
		if (d[i] > ans1) 
			ans1 = d[i];
	}
	//同长的情况下求最长页段
	for (i = 0; i <= end; i++) {
		if (d[i] == ans1) {
			b = 1, a = i;
			while (path[a] != 0) {
				b++;
				a = path[a];
			}
			ans2 = max(ans2, b);
		}

	}
	printf("%d %d\n", ans1, ans2);
	return 0;
}





你可能感兴趣的:(题解)