您的位置:首页 > 其它

Hdu 1513 & Poj 1159 (LCS) + Hdu 1025 (LIS)

2013-04-19 22:01 309 查看
LCS和LIS的水题,LCS那道用了滚动数组,貌似不用滚动数组会超内存

Hdu 1513 & Poj 1159

/*设原序列S的逆序列为S', 则
最少需要补充的字母数 = 原序列S的长度 - S和S'的最长公共子串长度*/
#include <cstdio>
#include <cstring>
#define max(x,y) ((x)>(y)?(x):(y))

int dp[2][5005];
char str[5005],ch[5005];

int main ()
{
	int n,i;
	while (~scanf("%d",&n))
	{
		scanf("%s",&str[1]);
		for (i=1;i<=n;i++)
			ch[n-i+1]=str[i];
		memset(dp,0,sizeof(dp));
		int k,max_len=0;
		for (int i=1;i<=n;i++)
		{
			k=i&1;
			for (int j=1;j<=n;j++)
			{
				if (str[i] == ch[j])     //如果数组从0开始存就改为str[i-1] == ch[j-1]
					dp[k][j]=dp[k^1][j-1]+1;
				else
					dp[k][j]=max(dp[k][j-1],dp[k^1][j]);
			}
		}
		printf("%d\n",n-dp[k]
);
	}
	return 0;
}
/*
10
2514785444
6
*/


Hdu 1025

#include <cstdio>

int stack[500005],data[500005];
 
int main ()
{
	int n,cas=1;
	while (~scanf("%d",&n))
	{
		int a,b,i;
		for (i=1;i<=n;i++)
		{
			scanf("%d%d",&a,&b);
			data[a]=b;
		}
		int top=0;
		stack[0]=-1;
		for (i=1;i<=n;i++)
		{
			if (data[i]>stack[top])
			stack[++top]=data[i];
			else
			{
				int low=1,high=top,mid;
				while (low<=high)
				{
					mid=(low+high)>>1;
					if (data[i] > stack[mid])
						low=mid+1;
					else
						high=mid-1;
				}
				stack[low]=data[i];
			}
		}
		printf("Case %d:\n",cas++);
		if (top==1)
			printf("My king, at most 1 road can be built.\n\n");   //输出格式坑爹……
		else 
			printf("My king, at most %d roads can be built.\n\n",top);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: