codeforces425C
http://codeforces.com/contest/425/problem/C
题意:两数列a[],b[],进行若干轮操作,每次操作花费e,
将a的一个前缀和b的一个前缀(两前缀的最后一个数字必须相同)删除,并得到虚拟1元,
最后的一次操作是将剩下的a[],b[]全部清空,花费是之前把a[],b[]删除的总数字个数,使得虚拟ans元变为真实ans元。
sol:首先有个很明显得暴力,就是n2求lcs
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,m,up,cost;
int a[N],b[N],dp[N][N];
int main()
{
freopen("codeforces425C_data.in","r",stdin);
int i,j;
R(n); R(m); R(up); R(cost);
for(i=;i<=n;i++) R(a[i]);
for(i=;i<=m;i++) R(b[i]);
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
dp[i][j]=;
if(i==j&&i==) continue;
if(i) dp[i][j]=dp[i-][j];
if(j) dp[i][j]=max(dp[i][j],dp[i][j-]);
if(a[i]==b[j])
{
dp[i][j]=max(dp[i][j],dp[i-][j-]+);
}
}
}
int ans=;
for(i=;i<=n;i++) for(j=;j<=m;j++) if(dp[i][j]*cost+i+j<=up) ans=max(ans,dp[i][j]);
Wl(ans);
return ;
}
bl
但是显然挂了,所以我就写了一个树状数组求lcs,然后告诉我相同数字多次出现。。。
考虑一种dp,dp[i,j]表示长度为i的公共子序列,a串匹配到j时b的最小位置
至于那个位置,万能的STL
/*
题意:两数列a[],b[],进行若干轮操作,每次操作花费e,
将a的一个前缀和b的一个前缀(两前缀的最后一个数字必须相同)删除,并得到虚拟1元,
最后的一次操作是将剩下的a[],b[]全部清空,花费是之前把a[],b[]删除的总数字个数,使得虚拟ans元变为真实ans元。
*/
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,inf=0x3f3f3f3f;
int n,m,up,cost;
int a[N],b[N];
int dp[][N];//dp[i,j]表示长度为i的公共子序列,a串匹配到j时b的最小位置
vector<int>Pos[N];
#define PB push_back
int main()
{
freopen("codeforces425C_data.in","r",stdin);
int i,j,ans=;
R(n); R(m); R(up); R(cost);
for(i=;i<=n;i++) R(a[i]);
for(i=;i<=m;i++)
{
R(b[i]); Pos[b[i]].PB(i);
}
for(i=;i<=n;i++) Pos[a[i]].PB(inf);
for(i=;i<=up/cost;i++)
{
dp[i][]=inf;
for(j=;j<=n;j++)
{
dp[i][j]=min(inf,dp[i][j-]);
int oo=lower_bound(Pos[a[j]].begin(),Pos[a[j]].end(),min(dp[i-][j-]+,inf))-Pos[a[j]].begin();
if(oo>m) continue;
dp[i][j]=min(dp[i][j],Pos[a[j]][oo]);
if(i*cost+dp[i][j]+j<=up) ans=i;
}
}
Wl(ans);
return ;
}
codeforces425C的更多相关文章
随机推荐
- flutter从入门到精通一
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台 flutter是基于dart语言开发的,我们将首先通过几章节 ...
- maven - 多模块构建
使用idea创建maven项目 点击next输入GroupId和ArtifactId 点击next创建项目,新建项目结构如下 修改demo打包方式为pom 按层级拆分创建模块model,server, ...
- POJ1979(Red and Black)--FloodFill
题目在这里 题目意思是这样的,一个人起始位置在 '@' 处,他在途中能到达的地方为 ' . ' 而 '#' 是障碍物,他不能到达. 问途中他所有能到达的 '.'的数量是多少 ? ...
- NodeList和HTMLCollection区别
关于DOM集合接口,主要不同在于HTMLCollection是元素集合而NodeList是节点集合(既包括元素,也包括节点). 规定一下结果是: . node.childNodes 结果返回类型是 N ...
- 正padding负margin实现多列等高布局(转)
转自: 巧妙运用CSS中的负值 (http://www.webhek.com/post/2345qwerqwer.html) 代码来自: https://codepen.io/Chokcoco/pen ...
- S3C2440 gpio
WATCHDOG TIMER 原理图 手册 举例 start.S .globl _start _start: /* 关看门狗 */ /* 往WTCON(0x53000000)写0 */ ldr r0, ...
- mysql数据库事件
今天在测试一个存储过程和数据库事件,就是到某一个固定时间,数据库自动调用一个存储过程实现一些功能. 单独来看事件是没有问题的 MINUTE STARTS '2015-12-09 02:00:00' O ...
- py-2 python介绍与安装
一.python介绍 1.python背景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Py ...
- Django组件之modelform
Django的model form组件 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,先来一个简单的例子来看一下这个东西怎么用:比如我们的数据库中有这样 ...
- AD19新功能之跟随走线
跟随走线 AD19新增跟随走线,比如需要按照特定的轨迹进行走线,比如要绕着一个圆进行走线,或者靠着边框走线,普通模式下的效果如下图所示,线会跟着指针跑: 在走线模式下,按住 shift + f ,然后 ...