|Vijos|动态规划|P1264 神秘的咒语

原创 2016年08月29日 16:53:12

https://vijos.org/p/1264

LCIS,也就是最长上升公共子序列

用dp[I][j]表示a[1..i]和b[1..j]的最长上升公共子序列,并以b[j]结尾

dp[I][j] = max(dp[I-1][j], max(dp[I-1][k]+1 | k<j && b[k]<a[I] && a[I]==b[j]))

不理解的强烈建议自己模拟一次样例

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




k可以在枚举i,j时候顺便求出,至于为什么自己模拟一遍就会发现,比我告诉你更好。

因此算法复杂度为O(n^2)
#include<iostream>
#include<cstdio>  
#include<cstring>   
#include<algorithm> 
#define ms(i,j) memset(i, j, sizeof(i)); 
using namespace std;
int a[505],b[505];
int f[505];
int m1, m2;
int main()  
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d", &m1);
		for (int i=1;i<=m1;i++)
		{
			scanf("%d", &a[i]);
		}	
		scanf("%d", &m2);
		for (int i=1;i<=m2;i++)
		{
			scanf("%d", &b[i]);
		}	
		ms(f,0);
		int ans = 0;
		for (int i=1;i<=m1;i++)
		{
			int k = 0;
			for (int j=1;j<=m2;j++)
			{
				if (a[i]==b[j])
				{
					f[j] = max(f[j], f[k]+1);
					ans = max(ans, f[j]);
				}
				else
				{
					if (a[i]>b[j])//a序列的i元素一定要大于b数组的j元素,因为是上升子序列 
					{
						if (f[k]<f[j])
						k = j;
					}
				}
			}
		}
		printf("%d\n", ans);
	}
    return 0;  
}  


版权声明:博客停更,请到"再见,CSDN"文章中找新博客地址

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:Offici...
  • u010568270
  • u010568270
  • 2017年04月03日 22:01
  • 381

动态规划100例

内容来自:文档资料库http://www.03964.com/ 更多"动态规划100例"相关资料请点击这里 一 资源问题.........................................
  • judyge
  • judyge
  • 2015年05月11日 11:57
  • 2991

Vijos P1493 传纸条(动态规划,双线程DP)

双线程DP,注意细节
  • qq_35855297
  • qq_35855297
  • 2016年08月26日 10:55
  • 270

神秘的咒语 LCIS

身为拜月教的高级间谍,你的任务总是逼迫你出生入死。比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底。 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语。为了习得这些法术,...
  • u013594723
  • u013594723
  • 2014年07月06日 09:25
  • 230

Vijos P1218 数字游戏(动态规划,环形DP)

环状DP,都要用到破环为链,其实很多方法都是相通的
  • qq_35855297
  • qq_35855297
  • 2016年08月24日 17:33
  • 722

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏。那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”任过流行起了一种简单的扫雷游戏...
  • u010568270
  • u010568270
  • 2017年04月05日 22:10
  • 282

|Vijos|动态规划|P1057 盖房子

https://vijos.org/p/1057 设f[i][j]为以i,j为正方形右下顶点的最大边长 不难得出初始值 f[i][j] = a[i][j] ,a为输入数组 则有状态转移方程 f[...
  • Darost
  • Darost
  • 2016年08月27日 10:09
  • 96

Vijos P1757 逆序对 (动态规划)

#include #include #include using namespace std; int T,n,k,f[1010][1010]; int main() { scanf("...
  • ndsffx501ccy
  • ndsffx501ccy
  • 2014年11月05日 20:47
  • 148

Vijos P1002 过河 (动态规划)

#include #include #include #include using namespace std; int f[20],a[200],n,s,t,m,p=1,ans=1000000000...
  • ndsffx501ccy
  • ndsffx501ccy
  • 2014年11月01日 19:54
  • 90

Vijos P1104 采药 动态规划

描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这...
  • u013555159
  • u013555159
  • 2016年01月17日 22:16
  • 964
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:|Vijos|动态规划|P1264 神秘的咒语
举报原因:
原因补充:

(最多只允许输入30个字)