热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

zoj2432(最长递增上升子序列)

算是LCIS的入门题吧,这个dp方法以前没怎么看,现在好好地学习了下,dp真的是奥妙无穷首先,dp的最开始是定义状态dp[i][j]表示A串的前i个,与B串的前j个,并以B[j]为结尾

算是LCIS的入门题吧, 这个dp方法以前没怎么看,现在好好地学习了下,dp真的是奥妙无穷...

首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度.

状态转移方程:

if(A[i]==B[j]) dp[i][j]=max(dp[i-1][k])+1;  ( 1 <= k

else dp[i][j]=dp[i-1][j];

然后选择循环顺序,就可以将算法的复杂度降为n*n.

 

Greatest Common Increasing Subsequence

Time Limit: 2 Seconds        Memory Limit: 65536 KB        Special Judge

You are given two sequences of integer numbers. Write a program to determine their common increasing subsequence of maximal 
possible length.

Sequence S1, S2, ..., SN of length N is called an increasing subsequence of a sequence A1, A2, ..., AM of length M if there exist 1 <= i1  


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

On the first line of the output print L - the length of the greatest common increasing subsequence of both sequences. On the second line print the subsequence itself. If there are several possible answers, output any of them.


This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.


Sample Input

1

5
1 4 2 5 -12
4
-12 1 2 4


Sample Output

2
1 4


Source: Northeastern Europe 2003, Northern Subregion

 

#include 
#include <string.h>
#include 
using namespace std;

#define N 550

struct node
{
    int x,y;
}path[N][N];

int dp[N][N];
int s[N],t[N];


int main()
{
    int t1;
    while(scanf("%d",&t1)!=EOF)
    {
        while(t1--)
        {
            memset(path,0,sizeof(path));
            int n,m;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d",&s[i]);
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
                scanf("%d",&t[i]);
            memset(dp,0,sizeof(dp));
            int mx=0;
            for(int i=1;i<=n;i++)
            {
                mx=0;
                int tx=0,ty=0;
                for(int j=1;j<=m;j++)
                {
                    dp[i][j] = dp[i-1][j];
                    path[i][j].x=i-1;
                    path[i][j].y=j;
                    if( s[i]>t[j] && mx1][j])
                    {
                        mx=dp[i-1][j];
                        tx=i-1;
                        ty=j;
                    }
                    if( s[i] == t[j] )
                    {
                        dp[i][j]=mx+1;
                        path[i][j].x=tx;
                        path[i][j].y=ty;
                    }
                }
            }
            mx=-1;
            int id;
            for(int i=1;i<=m;i++) 
                if(dp[n][i]>mx) 
                {
                    mx=dp[n][i];
                    id=i;
                }
            int save[N];
            int cnt=0;
            int tx,ty;
            tx=n; ty=id;
            while( dp[tx][ty] != 0 ) 
            {
                int tmpx,tmpy;
                tmpx=path[tx][ty].x;
                tmpy=path[tx][ty].y;
                if(dp[tx][ty]!=dp[tmpx][tmpy])
                {
                    save[cnt++]=t[ty];
                }
                tx=tmpx; ty=tmpy;
            }
            printf("%d\n",mx);
            for(int i=cnt-1;i>=0;i--)
                printf("%d ",save[i]);
            printf("\n");
        }
    }
    return 0;
}

 

 


推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
author-avatar
痛彻心扉哥哥_742
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有