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=0; bool f=0; char ch=' ';while(!isdigit(ch))    {f|=(ch=='-'); ch=getchar();}while(isdigit(ch)) {s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{if(x<0) {putchar('-'); x=-x;}if(x<10) {putchar(x+'0'); return;}write(x/10); putchar((x%10)+'0');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=1005;
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=1;i<=n;i++) R(a[i]);for(i=1;i<=m;i++) R(b[i]);for(i=0;i<=n;i++){for(j=0;j<=m;j++){dp[i][j]=0;if(i==j&&i==0) continue;if(i) dp[i][j]=dp[i-1][j];if(j) dp[i][j]=max(dp[i][j],dp[i][j-1]);if(a[i]==b[j]){dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);}}}int ans=0;for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(dp[i][j]*cost+i+j<=up) ans=max(ans,dp[i][j]);Wl(ans);return 0;
}

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=0; bool f=0; char ch=' ';while(!isdigit(ch))    {f|=(ch=='-'); ch=getchar();}while(isdigit(ch)) {s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{if(x<0) {putchar('-'); x=-x;}if(x<10) {putchar(x+'0'); return;}write(x/10); putchar((x%10)+'0');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=100005,inf=0x3f3f3f3f;
int n,m,up,cost;
int a[N],b[N];
int dp[305][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=0;R(n); R(m); R(up); R(cost);for(i=1;i<=n;i++) R(a[i]);for(i=1;i<=m;i++){R(b[i]); Pos[b[i]].PB(i);}for(i=1;i<=n;i++) Pos[a[i]].PB(inf);for(i=1;i<=up/cost;i++){dp[i][0]=inf;for(j=1;j<=n;j++){dp[i][j]=min(inf,dp[i][j-1]);int oo=lower_bound(Pos[a[j]].begin(),Pos[a[j]].end(),min(dp[i-1][j-1]+1,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 0;
}

View Code

转载于:https://www.cnblogs.com/gaojunonly1/p/11312378.html

codeforces425C相关推荐

最新文章

  1. windows中安装Node.js-安装angular-cli
  2. 【Android LibGDX游戏引擎开发教程】第07期:中文字体的显示和绘制(上)
  3. git 在 A 项目中引用 B 项目
  4. 提供程序未返回 ProviderManifestToken 字符串
  5. 24口光纤配线架 cad块_光纤配线架cad画法
  6. 太畅销了!AirTag送货时间延长至4-5周
  7. 企业办公oa系统医药OA办公后台管理会议管理用户管理物料管理活动管理/Axure医药内部管理平台/web端后台管理系统原型/医药OA系统/权限管理
  8. jq中的get()和eq()的区别
  9. [Visual Studio] VS2012调试时很慢的解决方案
  10. python iotextwrapp执行不动_Python tkinter - 第10章 文本控件(Text)方法
  11. 【优化算法】多目标人工蜂群算法(MOABC)【含Matlab源码 1236期】
  12. 最新最全linux系统调优指南(centos7.X)
  13. php 判断邮箱_php检测邮箱地址是否存在
  14. Structs2-Action
  15. 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
  16. java date the type is ambiguous,The type File is ambiguous,该如何解决
  17. 随机过程基础1--随机过程与宽平稳
  18. 深刻对比一下阿里云服务器和腾讯云服务器的优劣和区别
  19. 点点动画~画出懂你的3D魔方
  20. 使用Ionic.Zip压缩、分卷压缩、解压文件

热门文章

  1. Linux 批量依赖库拷贝(ldd)
  2. EyeDropper 开发实践
  3. Determine destination location of apt-get install package?
  4. tomcat 的安全规范
  5. BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元
  6. SCAU 07校赛 10317 Fans of Footbal Teams
  7. Android Service的绑定 基础概念篇
  8. Request: Headless HTML rendering engine
  9. Cisco实物图片库2
  10. 第一次用.net2.0 LOGIN登陆控件的困惑和解决方法