您的位置:首页 > 其它

UVa 111 - History Grading

2012-11-20 21:27 399 查看
题目:最大公共子序列。

分析:dp、LIS或LCS。最大上升子序列或最大公共子序列。当元素不重复时LCS可以转化为LIS,对应B序列每个元素转化为在A序列中的位置,求转化后序列的LIS即为两序列的LCS、可以用单调队列优化为O(nlogn)。

注意:输入给的是元素对应的顺序号需要转换、输入时使用while( cin )会导致WA。

LCS:

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

int map[ 35 ];
int dat[ 35 ];
int len[ 35 ][ 35 ];

int main()
{
	int n,temp;cin >> n;
	for ( int i = 1 ; i <= n ; ++ i ) {
		cin >> temp;
		map[temp] = i;
	}
	while ( cin >> temp ) {
		dat[temp] = 1;
		for ( int i = 2 ; i <= n ; ++ i ) {
			cin >> temp;
			dat[temp] = i;
		}
		
		memset( len, 0, sizeof(len) );
		for ( int i = 1 ; i <= n ; ++ i ) 
		for ( int j = 1 ; j <= n ; ++ j )
			if ( map[i] == dat[j] )
				len[i][j] = len[i-1][j-1]+1;
			else
				len[i][j] = max(len[i-1][j],len[i][j-1]);
		
		cout << len

 << endl;
	}
	return 0;
}
LIS:

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

int map[ 25 ];
int len[ 25 ];
int dat[ 25 ];

int main()
{
	int n,temp;cin >> n;
	for ( int i = 1 ; i <= n ; ++ i ) 
		cin >> map[i];
	
	while ( cin >> temp ) {
		dat[temp] = 1;
		for ( int i = 2 ; i <= n ; ++ i ) {
			cin >> temp;
			dat[temp] = i;
		}
		
		int max = 0;
		for ( int i = 1 ; i <= n ; ++ i ) {
			len[i] = 1;
			for ( int j = 1 ; j < i ; ++ j )
				if ( map[dat[j]] < map[dat[i]] && len[i] <= len[j] )
					len[i] = len[j]+1;
			if ( max < len[i] )
				max = len[i];
		}
		
		cout << max << endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: