codeforces425C
2024-06-03 17:19:05
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相关推荐
最新文章
- windows中安装Node.js-安装angular-cli
- 【Android LibGDX游戏引擎开发教程】第07期:中文字体的显示和绘制(上)
- git 在 A 项目中引用 B 项目
- 提供程序未返回 ProviderManifestToken 字符串
- 24口光纤配线架 cad块_光纤配线架cad画法
- 太畅销了!AirTag送货时间延长至4-5周
- 企业办公oa系统医药OA办公后台管理会议管理用户管理物料管理活动管理/Axure医药内部管理平台/web端后台管理系统原型/医药OA系统/权限管理
- jq中的get()和eq()的区别
- [Visual Studio] VS2012调试时很慢的解决方案
- python iotextwrapp执行不动_Python tkinter - 第10章 文本控件(Text)方法
- 【优化算法】多目标人工蜂群算法(MOABC)【含Matlab源码 1236期】
- 最新最全linux系统调优指南(centos7.X)
- php 判断邮箱_php检测邮箱地址是否存在
- Structs2-Action
- 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
- java date the type is ambiguous,The type File is ambiguous,该如何解决
- 随机过程基础1--随机过程与宽平稳
- 深刻对比一下阿里云服务器和腾讯云服务器的优劣和区别
- 点点动画~画出懂你的3D魔方
- 使用Ionic.Zip压缩、分卷压缩、解压文件
热门文章
- Linux 批量依赖库拷贝(ldd)
- EyeDropper 开发实践
- Determine destination location of apt-get install package?
- tomcat 的安全规范
- BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元
- SCAU 07校赛 10317 Fans of Footbal Teams
- Android Service的绑定 基础概念篇
- Request: Headless HTML rendering engine
- Cisco实物图片库2
- 第一次用.net2.0 LOGIN登陆控件的困惑和解决方法