【codechef】Chef and the Cards(dp,推论)

UPC——训练赛 :卡片 问题 F: 卡片 时间限制: 1.000 Sec内存限制: 128 MB提交 状态 题目描述 牛牛有n张卡片,每i张卡片上有一个数字ai。牛牛在里面选出了k张,按照某种顺序依次排列成一个数。 比如牛牛选出了3,13,1这三张卡片,牛牛就可以排列成3131,3113,1331,1313,1133这五个数。 你需要帮牛牛求出对于所有选出k张卡片的方案,牛牛总共能拼成多少种不同的数字。 输入 第一行两个整数n,k,表示卡片的个数和选出卡片的张数。 接下来一行n个空格分隔的整数a1,…,an,表示.. 阅读详情

从前有 N 张卡片,在桌上摊成了一排。每张卡片上有两个数字,一个写在上边,一个写在下边,每个数字都是 1 到 N 之间的一个整数(也包含 1 和 N)。同时,在所有卡片的上边的数字中,1 到 N 的每个数字恰好出现了一次。下边的数字也一样。

大厨想要给这些卡片重新排个序。他希望在重排之后,卡片上边的数字构成的序列,还有卡片下边的数字构成的序列,这两个序列的最长公共子串尽量长。

这里子串的意思是一段连续的子序列。但他不能涂改卡片上的数字,也没法把卡牌倒过来放,也就是说,原本在上边的数字还在上边,下边亦同。

请你求出最长公共子串的最大长度。

输入格式

第一行包含一个整数 T,表示数据组数。接下来是 T 组数据。每组数据的第一行包含一个整数 N。每组数据的第二行包含 N 个整数 A1, A2, . . . , AN,以空格隔开。Ai(1 ≤ i ≤ N) 代表第 i 张卡片上边的数字。每组数据的第三行包含 N 个整数 B1, B2, . . . , BN,以空格隔开。Bi(1 ≤ i ≤ N) 代表第 i 张卡片下边的数字。

输出格式

对于每组数据,输出一行,包含一个整数 L:最长公共子串的最大长度。

Constraints

  • 1 ≤ T ≤ 100
  • 1 ≤ N ≤ 2000
  • 1 ≤ Ai, Bi ≤ N
  • All the elements in both arrays A and B are distinct.

Example

Input:
2
3
1 3 2
2 1 3
8
3 8 4 2 6 1 5 7
5 2 4 3 8 7 6 1

Output:
2
4
样例解释

第一个样例:一种可行的卡牌摆放方法如下:

1 2 3

2 3 1

序列 [1, 2, 3] 与序列 [2, 3, 1] 的最长公共子串是序列 [2, 3],长度为 2。而以任意其他的方式排列卡牌,都无法得到更长的最长公共子串。故答案为 2。

第二个样例:一种可行的卡牌摆放方法如下:

7 3 2 8 6 5 4 1

1 5 3 2 8 6 4 7

最长公共子串为 [3, 2, 8, 6],长度为 4。说明假设答案为 L。记重排之后处于第 i 位的卡牌的上边的数字为 Ci,下边的数字为 Di。那么,应当存在 x 和 y(1 ≤ x, y ≤ N − L + 1) 满足,对于任意 0 ≤ j < L,都有 Cx+j = Dy+j。

http://www.codechef.com/COOK61/problems/CARDLINE

英文题解看得好头疼啊。。好在最后还是看懂了。。

举一个例子:

7
4 2 6 5 3 7 1  A数组
4 5 6 3 2 1 7  B数组
假如有下标i,j满足Ai==Bj,那么就把这两个下标连起来,最后形成下面的图:

 ____       1-----3
|    |       \   /
0____|        \ /
               4 
 ____        ____
|    |      |    |
2____|      5____6
以第二个图为例,

A‘ = 2 5 3
B’ = 5 3 2

此时的ans=2。

假如在AB数组的空隙间插入几个数,变成:

A = 2 x 5 y 3
B = 5 a 3 b 2
如果y==a,那么此时ans=3

再来引出一个例子:

A = 1 2 3   6 7 8   4 5
B = 2 3 1   7 8 6   5 4
此时可以画出三个图。用上面的思想考虑把这三个图插缝拼起来:

A = 1 6 4 2 7 5 3 8
B = 2 7 5 3 8 4 1 6
ans=5

然而需要注意的是,只有几个两两大小之差<=1的图才能执行上述操作。(为什么?)

即只有长度为m或m+1的图才能插缝。(1<=m<=n-1)

观察到,插缝时每个图对ans的贡献都是len-1。(上面问题的答案,<=1才能计算贡献值)

然后放出下面这个神奇的DP。。。

	for(int k=1;k<=nax-1;++k){
		for(int i=1;i<=nax-1;++i){
			dp[k][i] = 0;
			if(i-k >= 0) dp[k][i]=max(dp[k][i], dp[k][i-k] + k - 1);
			if(i-k-1 >= 0) dp[k][i]=max(dp[k][i], dp[k][i-k-1]+k);
		}
	}

dp[k][i]的意思是在对限定长度为k(或k+1)插缝后数组总长度为i的情况时最长公共子串长度。这个部分可以预处理。

#include<iostream>
#include<algorithm>
#include<string>
#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}
#include<vector>
#include<cmath>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define nax 2005
#define ll long long
using namespace std;
int inv[nax];
int a[nax], b[nax];
bool vis[nax];
int t[nax];
int dp[nax][nax]; 
void te() {
	int n;
	scanf("%d", &n);
	for(int i=1;i<=n;++i)
		scanf("%d", &a[i]);
	for(int i=1;i<=n;++i){
		scanf("%d", &b[i]);
		inv[b[i]] = i;
	}
	for(int i=1;i<=n;++i)
		vis[i] = false;
	for(int i=1;i<=n;++i){
		if(!vis[i]) {
			int k = 0;
			do {
				++k;
				vis[i] = true;
				i = inv[a[i]];
			} while(!vis[i]);
			t[k]++;  //最长公共子串长度为k的图有几个
		}
	}
	int r = 0;
	for(int i=1;i<=n;++i)
		 if(a[i] == b[i]) 
		 	++r;
	for(int k=1;k<=n;++k){
		int c = 0;
		for(int i=1;i<=n;++i){
			c += t[i] * dp[k][i]; //把原本最长公共子串长度为i的图划分成几个最长公共子串长为k或k+1的图,再计算这些图插缝后总长为i的贡献值,再加到c中,相当于i长度已经插缝好的串再跟c里原本有的这个最长公共子串长度为k或k+1的串插缝,求和即得到最新的最长公共子串长度
		}
		r = max(r, c);
	}
	printf("%d\n", r);
	for(int i=0;i<=n;++i) 
		t[i] = 0;
}	
int main() {
	for(int k=1;k<=nax-1;++k){
		for(int i=1;i<=nax-1;++i){
			dp[k][i] = 0;
			if(i-k >= 0) dp[k][i]=max(dp[k][i], dp[k][i-k] + k - 1);
			if(i-k-1 >= 0) dp[k][i]=max(dp[k][i], dp[k][i-k-1]+k);
		}
	}
	int z;
	scanf("%d", &z);
	while(z--) te();
	return 0;
}


动态规划专题小结:四边形不等式优化 今天第一次学习四边形不等式优化dp,感觉优化效果十分给力,不过数学味道比较浓重,证明比较复杂。因此这里删繁就简,给出关于四边形不等式优化必须要明白的地方,以后直接套用条件即可。 四边形不等式优化条件 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j 阅读详情

相关推荐

Python逆向实战:突破PDD长连接抓包的技术解析

本文详细解析了如何通过Python逆向技术突破PDD长连接抓包的难点,包括分析PDD的网络机制、绕过SSL证书验证以及完整抓包实战流程。文章重点介绍了使用Frida和VAXposed工具解决长连接和SSL Pinning问题,并提供了Python代码示例和数据分析方案,帮助开发者高效抓取PDD数据。

weixin_28678151的博客 1224

整数卡片

选择第1,2,4,101,2,4,10张卡改成30,数组变成 [30,30,10,30,100,10,52,33,13,30][30,30,10,30,100,10,52,33,13,30]。选择第1,3,61,3,6张卡改成10,数组变成 [10,8,10,7,100,10,52,33,13,5][10,8,10,7,100,10,52,33,13,5]。第1次操作:B1​=2,C1​=3,可以最多选2张卡改成3。第2次操作:B2​=1,C2​=5,可以最多选1张卡改成5。第1行,2个正整数N,M。

AnnaWu13的博客 657

腾讯滑块验证码collect参数逆向与JSVMP对抗实战

本文深入解析腾讯滑块验证码collect参数的逆向过程与JSVMP虚拟机对抗技术。通过详细的环境搭建、抓包分析和JSVMP逆向技巧,揭示collect参数的生成逻辑与加密流程,并提供完整的模拟实现方案和常见问题排查方法,助力开发者突破腾讯天御验证码的防护机制。

weixin_29009501的博客 1578

AcWing 4397. 卡牌(枚举 + 模拟)

有nn张卡牌,编号1∼n1∼n。 每张卡牌的正面和背面都各有一个数字。 第ii张卡牌的正面数字为aiai,背面数字为bibi。 初始时,所有卡牌都正面朝上,显示正面的数字。 现在,你可以将其中一些卡牌翻面,使其显示背面的数字,要求: 至少有kk张卡牌保持正面朝上。 所有卡牌显示的数字之和尽可能小。 输出所有卡牌显示的数字之和的最小可能值。 输入格式 第一行包含两个整数n,kn,k。 第二行包含nn个整数a1,a2,…,ana1,a2,…,an。 第三行包含nn...

weixin_57202646的博客 917

Redis【实战篇】---- 分布式锁-redission

重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。

是微风,是晚霞,是无可替代 1万+

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 546

Leetcode--纸牌游戏

牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。 牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。 他们的得分等于他们抽到的纸牌数字总和。 现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。 输入描述: 输入包括两行。 第一行包括一个正整数n(1 <= n &l...

半途行走的博客 1219

KUKA 虚拟调试实战——打通Simpro4.1与OfficeLite8.6的通信与实时控制链路

本文详细介绍了KUKA虚拟调试实战,重点解析如何打通Simpro4.1与OfficeLite8.6的通信与实时控制链路。通过环境搭建、权限配置、机器人型号匹配等关键步骤,帮助工程师高效完成机器人轨迹规划和PLC联锁逻辑验证,大幅降低真机调试风险。文章还提供了典型报错解决方案和实时控制优化技巧,适用于工业机器人仿真与培训场景。

weixin_30907935的博客 451

腾讯 纸牌游戏 (排序)

原文链接:https://www.nowcoder.com/test/10611931/summary [编程题] 纸牌游戏 时间限制:1秒 空间限制:32768K 牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。 牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。 他们的得分等于他们抽到的纸牌数字总和。 现在...

qq_29762941的博客 3062

Vlan的封装模式和端口讲解(Access、Trunk、Hypbrid端口)

Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域,在交换机上实现广播域隔离(增强局域网的安全性、限制广播风暴、简化网络管理)Vlan通过将二层数据帧打上Vlan标签(打上Vlan标签也就是封装Vlan),正常情况下,不同Vlan Tag的数据包是无法二层直接互访的,以此来实现广播域的隔离可以理解为一个Vlan对应一个广播域,同一Vlan内的主机可以二层直接通信,不同Vlan间的主机无法二层直接通信。

m0_49864110的博客 5644

海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)

海洋CMS admin_notify.php 接口处存在远程代码执行漏洞,经过身份验证的远程攻击者可利用该漏洞执行任意代码,写入后门文件,进而控制整个web服务器。

0xSec 2715

CodeChef Cards, bags and coins [DP 泛型背包]

https://www.codechef.com/problems/ANUCBC n个数字,选出其一个子集。求有多少子集满足其中数字之和是m的倍数。n $\le$ 100000,m $\le$ 100,最多90组数据   傻逼题模数取什么1e9+9毁我一节课该死煞笔提 [15:13:47]刚刚心塞了一会儿出去跑了几步好点了,然后发现好像是生物老师在艺术楼走廊上给人讲题(今天好像有学校给...

weixin_34314962的博客 181

ubuntu 20.04 搭建多用户远程桌面共享及同时在线使用

摘要:本文介绍了在物理机上配置远程桌面访问的完整流程。通过setup_xrdp.sh脚本自动安装xrdp服务,修改配置文件并开放3389端口。同时提供了用户管理脚本:add_rdp_users.sh用于创建带sudo权限的远程用户,del_rdp_users.sh用于删除用户及主目录。还包含批量操作脚本add_rdp_all.sh和del_rdp_all.sh,支持一次性创建/删除多个用户(如dev1-dev5),所有用户密码统一设置为111111。完整方案实现了远程桌面环境的快速部署和用户集中管理。

623

codechef:April Challenge 2014: Cards, bags and coins

http://www.codechef.com/APRIL14/problems/ANUCBC Statement Yet another game from chef. Chef gives you N cards and M bags. Each of the N cards has an integer written on it. Now chef asks you

kevinkitty_love的专栏 1807

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Codechef CARDLINE

题目描述 从前有$N $张卡片,在桌上摊成了一排。每张卡片上有两个数字,一个写在上边,一个写在下 边,每个数字都是 $1 $到 \(N\)之间的一个整数(也包含\(1\)和$ N$)。同时,在所有卡片的上边的数字 中,\(1\)到 \(N\)的每个数字恰好出现了一次。下边的数字也一样。 大厨想要给这些卡片重新排个序。他希望在重排之后,卡片上边的数字构成的序列,还有卡 片下边的数字构成的序列,这两个...

weixin_30347009的博客 137

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【codechef】Chef and Polygons(灵活题,坑题)

Input: 1 3 6 -2 2 -1 1 2 2 2 -1 1 -2 -2 -2 3 -1 -1 1 -1 1 1 4 3 3 -3 3 -3 -3 3 -3 Output: 1 0 2 Explanation In the picture the first polygon is marked in green, second - in red and third in b

芒果街上的小屋(此博客暂时停用) 892

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

CodeChef--Cards, bags and coins

题目链接 Yet another game from chef. Chef gives youNcards andMbags. Each of theNcards has an integer written on it. Now chef asks you to close your eyes and choose a subset of them. He then sums ...

weixin_34146805的博客 170

Codechef REBXOR[dp+字典树]

解题思路:1.区间异或和可以搞前缀[or后缀]异或,xori=lra=pre[l]⊕pre[r]xor_{i=l}^{r}a=pre[l]\oplus pre[r]xori=lr​a=pre[l]⊕pre[r] 2.那么题目就变成了pre[l]⊕pre[r]+suf[l1]⊕suf[r1],pre是前缀异或和,suf是后缀异或和pre[l]\oplus pre[r] +suf[l_1]\oplus suf[r_1],pre是前缀异或和,suf是后缀异或和pre[l]⊕pre[r]+suf[l1​]⊕s...

weixin_45630722的博客 490

Codechef LEBOXES 折半搜索+dp

题意 有n个盒子,第iii个盒子有pipip_i的概率开出viviv_i元,其余1−pi1−pi1-p_i的概率开出一颗钻石。有m件物品,购买第iii件物品需要花费cicic_i元和didid_i颗钻石,且每件物品只能购买一次。假设每次开完盒子后会选择最优的方案去购买数量尽量多的物品,问期望购买多少件物品。 2≤n≤30,1≤m≤30,1≤vi,cj≤107,0≤dj≤302≤n≤30,1≤m...

beginend 360

状态与状态转移方程

状态与状态转移方程 在之前的两节中已经讨论了两类较为经典的动态规划问题的解法,本节将对两种算法进行总结,并探讨解动态规划问题的统一思路。 回顾两种经典问题的算法模式,都先定义了一个数字量,如最长递增子序列中用dp[i]表示以序列中第i个数字结尾的最长递增子序列长度和最长公共子序列中用 dp[[i][j]表示的两个字符串中前 i、j 个字符的最长公共子序列,就是通过对这两个数字量的不断求解最终得到答...

Yoc Lu 1万+

CODECHEF:Change the Signs(dp & 思维)

You are given a sequence of integers A1,A2,…,ANA1,A2,…,AN.You should choose an arbitrary (possibly empty) subsequence of AA and multiply each element of this subsequence by −1−1. The resulting sequenc...

junior19的博客 401

codechef DGCD (树链剖分)

给定一棵树 1:求链上gcd 2:给一个路径共同加一个给定数   待区间修改的区间gcd问题,可以用差分后线段树做。就是 gcd(起始位置原值,之后的差分数组中gcd); 对于树上,只需要把树剖成链,对于询问和操作,单独处理每一个小区间就好,做法和序列上一样。   区间修改就是,在差分数组中 head位置加上val,tail+1位置减去val   #include #includ

running_in_dark的博客 829

[CodeChef Nov Challenge]Max-digit Tree

Description 给出以1为根的有根树,每个点上有个数字di (d1!=0) 定义一个包含1的连通块对应的数是其按编号从小到大做dfs序得到的序列中,di按顺序连接起来形成的数字 定义序列a,满足a1=1,ai=ai−1+maxdigit(ai−1)a_1=1,a_i=a_{i-1}+maxdigit(a_{i-1})a1​=1,ai​=ai−1​+maxdigit(ai−1​) 其中max...

时光真疯狂, 我一路执迷于匆忙. 457

CodeChef STRSUB(dp+二分)

题意:(中文题意) https://codechef_shared.s3.amazonaws.com/download/translated/MARCH15/mandarin/STRSUB.pdf 解析: 先预处理一个数组pre[],pre[i]表示i这个位置,往前最多能找到哪个位置是满足0和1都不大于k的。 然后以每个位置i为左区间的长度就可以计算出,为 (r - pre[i] +

小G的ACM之路 911

【codechef】Magical Transformation(dp,技巧题)

Irfan and his brother Yusuf were looking at photographs of their vacation to Hawaii. Irfan noticed something interesting. He noticed that if their aunt Mansi had a big beard and a moustache she would

芒果街上的小屋(此博客暂时停用) 539

CodeChef:Good Pairs(dp & 二进制)

You are given N integers: A1, A2, ..., AN. You need to count the number of pairs of indices (i, j) such that 1 ≤ i j ≤ N and Ai | Aj ≤ max(Ai, Aj). Note: Ai | Aj refers to bitwise OR. Inpu

junior19的博客 511
上一篇: poj1426 Find The Multiple(哈夫曼思想)
下一篇: swerc2014 GREAT + SWERC = PORTO(dfs,注意姿势)
ccyy-
博客等级 码龄12年 31粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值