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 ;
}

最新文章

  1. JS原生第三篇 (帅哥)
  2. win使用MSYS2安装Qt开发环境
  3. QTableWidget 使用及美化_QtableWidget_QtableView滚动条宽度及样式
  4. Linux-NTP-Server+Client
  5. 线上redis服务内存异常分析。
  6. js中的String数据类型
  7. 4.4 CUDA prefix sum一步一步优化
  8. 探究为何rem在chrome浏览器上计算出错
  9. IOS开发之网络开发工具
  10. php之类,对象(二)继承性,static静态的,const常量
  11. 在Ubuntu Linux下制作Windows 启动安装 USB盘
  12. shell统计文本中单词的出现次数
  13. 【转】Linux下软、硬链接的创建和删除
  14. 深入理解ES6之—增强的数组功能
  15. requests关于Exceeded 30 redirects问题得出的结论
  16. .Net中json序列化与反序列化
  17. Windows激活客户端 已停止工作
  18. APP端上传图片 - php接口
  19. Liferay7.0与cas单点登录配置
  20. iOS - 使用MPMoviePlayerController播放在线视频

热门文章

  1. Spring高级进阶:BeanFactoryPostProcessor
  2. WPF不同方式快捷键判断
  3. Sharding-JDBC介绍
  4. 【转载】Sqlserver使用Convert函数进行数据类型转换
  5. MM-发票校验与收货的差异处理
  6. Android NDK 学习之在C中调用Java的变量和静态变量
  7. Dubbo面试
  8. JAVA笔记整理(三),JAVA中的类和方法
  9. 数组中的filter,every,some,find,findIndex
  10. 凤凰新闻APP的增长黑客流程步骤经验:3.5星|《我不是产品经理》