• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

hdu 1423 Greatest Common Increasing Subsequence

Greatest Common Increasing Subsequence

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2847 Accepted Submission(s): 885

Problem Description
This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence.
 

 

Input
Each sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - the sequence itself.
 

 

Output
output print L - the length of the greatest common increasing subsequence of both sequences.
 

 

Sample Input
1 5 1 4 2 5 -12 4 -12 1 2 4
 

 

Sample Output
2
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 510
#define inf 0x3fffffff
int a[N],b[N];
struct node{
	int l,k;
}f[N];
void up(node &x,node &y){
	if(x.l==y.l&&x.k>y.k)x.k=y.k;
	if(x.l<y.l){x.l=y.l;x.k=y.k;}
}
int main(){
	int i,j,k;
	int T,n,m;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(i=1;i<=n;i++)scanf("%d",&a[i]);
		scanf("%d",&m);
		for(i=1;i<=m;i++)scanf("%d",&b[i]);

		for(j=1;j<=m;j++){f[j].l=0;f[j].k=inf;}
		f[0].l=0;f[0].k=-inf;

		for(i=1;i<=n;i++){
			for(j=1;j<=m;j++){
				up(f[j],f[j-1]);
				if(a[i]==b[j]&&a[i]>f[j-1].k){
					node t;
					t.l=f[j-1].l+1;
					t.k=a[i];
					up(f[j],t);
				}
			}
		}
		//for(i=0;i<=m;i++)printf("%d %d\n",f[i].l,f[i].k);
		printf("%d\n",f[m].l);
		if(T)printf("\n");
	}
return 0;
}

//这是别人的代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 510
#define inf 0x3fffffff
int a[N],b[N],f[N];
int main(){
	int i,j,k;
	int T,n,m;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(i=1;i<=n;i++)scanf("%d",&a[i]);
		scanf("%d",&m);
		for(i=1;i<=m;i++)scanf("%d",&b[i]);
		memset(f,0,sizeof(f));
		for(i=1;i<=n;i++){
			k=1;
			for(j=1;j<=m;j++){
				if(a[i]>b[j]&&f[j]>f[k])k=j;//选取最优长度更新后面,用到的是贪心思想,反正我这死脑筋想不到= =!
				else if(a[i]==b[j])f[j]=f[k]+1;
			}
		}
		for(i=1;i<m;i++)f[m]=f[m]>f[i]?f[m]:f[i];
		printf("%d\n",f[m]);
		if(T)printf("\n");
	}
return 0;
}


posted @ 2013-08-15 18:26  Class Xman  阅读(189)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3