UESTC 883 方老师与两个串 --二分搜索+DP
CF原题
由题可知,n,m太大,无法开出dp[n][m]的数组。
观察发现s/e最大为300,也就是说,选用第一种操作的次数不会超过300。
于是定义dp[i][j],第一个串的前i个数,使用了j次第一种操作的时候,第二个串最少删了多少个数。
转移有两种情况:
1.当前位置不删,这时dp[i][j]=dp[i-1][j];
2.当前位置删,此时就需要在B串中找和当前位置的数相同的数的位置,并且只有在找到的位置大于dp[i-1][j-1]的时候才是可行的。为了保证dp[i][j]最小,显然就是找大于dp[i-1][j-1]这个位置的第一个和当前数相同的数。
二分查找解决,lower_bound或upper_bound解决更加简便。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define Mod 1000000007
using namespace std;
#define N 100007 int dp[N][];
int a[N],b[N];
vector<int> v[N]; int main()
{
int n,m,s,e;
int i,j;
scanf("%d%d%d%d",&n,&m,&s,&e);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=m;i++)
{
scanf("%d",&b[i]);
v[b[i]].push_back(i);
}
int S = s/e;
for(i=;i<=n;i++)
{
dp[i][] = -;
for(j=;j<=S;j++)
dp[i][j] = Mod;
}
for(i=;i<=m;i++) //a的第一个对应的最小位置
{
if(b[i] == a[])
{
dp[][] = i;
break;
}
}
//meiju
vector<int>::iterator it;
for(i=;i<=n;i++)
{
for(j=;j<=S;j++)
{
dp[i][j] = min(dp[i][j],dp[i-][j]); //当前位置不删
it = upper_bound(v[a[i]].begin(),v[a[i]].end(),dp[i-][j-]);
if(it != v[a[i]].end()) //如果能找到,更新最小位置
dp[i][j] = min(dp[i][j],*it);
}
}
int res = -Mod;
for(i=;i<=n;i++)
{
for(j=;j<=S;j++)
{
if(i + dp[i][j] + j*e <= s) //满足能量范围
res = max(res,j);
}
}
printf("%d\n",res);
return ;
}
UESTC 883 方老师与两个串 --二分搜索+DP的更多相关文章
- UESTC 898 方老师和缘分 --二分图匹配+强连通分量
这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...
- UESTC - 900 方老师炸弹 —— 割点
题目链接:https://vjudge.net/problem/UESTC-900 方老师炸弹 Time Limit: 4000/2000MS (Java/Others) Memory L ...
- UESTC 884 方老师的专题讲座 --数位DP
定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...
- UESTC 885 方老师买表 --状压DP
将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...
- UESTC 899 方老师和农场 --双连通分量的构造
首先将原图中的连通分量缩点,一定可以将原图缩成一棵树的形式,然后统计这棵树的叶子节点个数,答案就是(leaf+1)/2.这里不再证明,可以画个图看一下. (简单说明一下,首先把两个最近公共祖先最远的两 ...
- UESTC 914 方老师的分身I Dijkstra
题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...
- UESTC 915 方老师的分身II --最短路变形
即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大 ...
- UESTC 886 方老师金币堆 --合并石子DP
环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
随机推荐
- jsp中自定义Taglib案例
一.使用TagSupport类案例解析 1.自定义Tag使用jdbc连接mysql数据库 1.1定义标签处理器类 package com.able.tag; import java.sql.Conne ...
- lnmp+phpmyadmin配置与出现问题
本博客归moka同学(新浪微博:moka同学)本人亲自整理,如有使用,请加链接注明出处. lnmp 安装完全后,配置phpmyadmin .其访问方式为 http://202.18.400.379/p ...
- IOS网络编程之请求内容
资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...
- ng-show
//当ng-show="false"时,自动添加 #animate.ng-hide { } #animate.ng-hide-add { } #animate.ng-hide-ad ...
- yii url美化 urlManager组件
yii的官方文档对此的解释如下: urlSuffix 此规则使用的url后缀,默认使用CurlManger::urlSuffix,值为null.例如可以将此设置为.html,让url看起来“像”是一 ...
- C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...
- Quartz2D学习笔记
1.drawRect方法 //1.证明drawRect方法是在viewDidLoad后自动调用的,方便处理View的相关属性 // YQView * view = [[YQView alloc] in ...
- 网络开始---多线程---NSThread-01-基本使用(了解)(二)
#import "HMViewController.h" @interface HMViewController () @end @implementation HMViewCon ...
- 保持listview当前位置
保持listview滑动的位置,一般用在增加listview子item中布局的评论或者退出当前活动,再次进入继续阅读时. 利用ListView.getFirstVisiblePosition()来获取 ...
- const,static,extern简介(重要)
一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 编译时刻:宏是预编译(编译之前处理),const是编译 ...