• 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
    ",f[i].l,f[i].k);
    		printf("%d
    ",f[m].l);
    		if(T)printf("
    ");
    	}
    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
    ",f[m]);
    		if(T)printf("
    ");
    	}
    return 0;
    }


  • 相关阅读:
    vue 设置请求超时时间处理
    element 表格只展开一行(点击下一行上一行关闭)
    element菜单刷新后定位问题?
    自己觉得不错的滚动条样式
    $.ajax()方法详解
    安卓获取自有证书的SHA1码
    sortable.js 拖拽排序及配置项说明
    uni-app 引入本地iconfont的正确姿势以及阿里图标引入
    mui slider禁止滑动
    stl源码剖析 详细学习笔记 仿函数
  • 原文地址:https://www.cnblogs.com/james1207/p/3260384.html
Copyright © 2020-2023  润新知