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的更多相关文章
随机推荐
- hdu 2822 ~!!!!!!坑死我
首先 在此哀悼... 为我逝去的时间哀悼... 每一步都确定再去写下一步吧...日狗 不过还是有点收获的.. 对优先队列的使用 有了进一步的理解 先上代码 #include<iostrea ...
- 多线程使用libcurl
curl默认情况下有两个地方是线程不安全的, 需要特殊处理, 1是curl_global_init 这个函数必须单线程调用, 2是默认多线程调用https会莫名其妙的挂掉, 以下是网上的解决方案 ht ...
- J.U.C之重入锁:ReentrantLock
此篇博客所有源码均来自JDK 1.8 ReentrantLock,可重入锁,是一种递归无阻塞的同步机制.它可以等同于synchronized的使用,但是ReentrantLock提供了比synchro ...
- 低功耗蓝牙UUID三种格式转换
熟悉BLE技术同学应该对UUID不陌生,服务.特征值.描述都是有UUID格式定义. 蓝牙广播中对服务UUID格式定义都有三种16 bit UUID.32 bit UUID.128 bit UUID. ...
- Centos 6.5 Apache服务安装
Apache是什么: Apache HTTP Server(简称Apache)是Apache软件基金会的一个高性能.功能强大.稳定可靠.又很灵活的开发源代码的web服务软件,对linux的支持相对好 ...
- RestFramework之视图组件
一.视图组件的使用 在我们自己书写视图类时需要不断书写重复冗余的代码,看起来十分繁琐不简洁易见,当然rest_framework中的视图组件帮我们做到了一些必要的步骤,使我们节省了编写冗余代码的时间. ...
- Gitlab CI/CD任务一直处于pending
在注册Runner时候这里输入了tag,这里指的是runner的标签,可以设置多个 ,分别用 ,号分割 .gitlab-ci.yml文件中 stages: - pull - package - bu ...
- Python_if语句
1.if语句: color='红色' if color=='蓝色': print('我是蓝色') elif color=='红色': print('我是红色') else : print('未知') ...
- springboot 配置 中查找application.properties中对应的数据,添加对应的prefix前缀
@ConditionalOnProperty(prefix = "spring.redis", name = "enabled", havingValue = ...
- python 获取本机的 IP 地址,windows,linux均可
#encoding=utf-8 #参考csdn某篇文章 import socket def get_host_ip(): """ 查询本机ip地址 :return: ip ...