【56测试】【字符串】【dp】【记忆化搜索】【数论】
第一题:神秘大门 大意:
两个字符串A,B,按字典序最大的顺序输出B 的每个字符在A 中的位置,如果B不全在A中,输出No,否则Yes。
解:
这道题就是一遍的扫描,因为要按字典序最大的输出,所以从后面向前面扫描。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000005
using namespace std;
string s1,s2;
int xi,yi,ans[maxn],head;
int main()
{
freopen("door.in","r",stdin);
freopen("door.out","w",stdout);
cin>>s1;cin>>s2;
xi=s1.size();yi=head=s2.size();
if (xi!=&&yi==){
cout<<"No";
return ;
}
while (yi!=&&xi!=)
{
if (s1[xi-]==s2[yi-]) {
ans[yi]=xi;
yi--;
}
xi--;
}
if (xi==&&yi!=) {
cout<<"No";
return ;
}
cout<<"Yes"<<endl;
for (int i=;i<=head;i++)
printf("%d\n",ans[i]);
return ;
}
第二题 集结蚂蚁 大意:
给一个矩阵,1表示不通,0表示可走。奇数行是路径,偶数行的连续的0是蚁巢。从第一行开始往下走,问走到最后一行时经过的蚁巢的总大小。蚁巢的大小为连续的0的个数。如果不能到最后一行,则输出-1。
样例:
10 10
1111101111
1100001011 4
1101111111
1100000101 5
1110110111
1000110001 3
1101111011
1101000011 4
1101011111
1101010001 1
17
解:
自己画完图后,想的是这道题肯定是动规 ,但是我还是用搜索吧。其实当时也想过用图做,把每一个蚁巢看做节点,然后把奇数行的路径看做边,把蚁巢的大小当做边的权值(如果有多个蚁巢,则取最大的),再搜一条最长路径就可以了。本以为是一棵树,但是觉得路径不一定只有一个0,可能有传递性,就又冒出来一个想法,可以对每一个蚁巢记录三个:bool in,out;表示有没有路径穿过它,否则这个蚁巢也没用;一个sum,记录走到这个蚁巢最大的ans大小。然后注意到当前蚁巢只会由上一个蚁巢推得,就用一个滚动数组。
还有一个问题,就是判断能不能走到最后一行。先开始因为我用的滚动,所以相当于只判断了最后一行有没有连路径,但有可能这条路径不是与第一行联通的,所以 in 这个判断要从第一行向下传递,而不只是从上一行的路径传递下来。
写动规的话,好像比我的代码少了好多行。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define maxn 5005
#define maxm 2005
using namespace std;
struct pp{
bool in,out;
int sum;
};
pp ant_home[][maxm];
bool isroad[maxm];
int n,m,cnt,road[maxm],home[maxm],cur=,suf,last_cnt,ans;
char c[maxm];
void clr_suf()
{
//cnt=0;
for(int i=;i<=last_cnt;i++)
{
ant_home[suf][i].in=false;
ant_home[suf][i].out=false;
ant_home[suf][i].sum=;
}
}
void worki()//处理路径
{
memset(road,,sizeof(road));
memset(isroad,,sizeof(isroad));
for (int i=;i<=m;i++)//更新可走蚁巢和标记
if (c[i]==''){
isroad[i]=true;
if (home[i]!=){//上一行
road[i]=home[i];
ant_home[suf][home[i]].out=true;
}
int st=i;
while(c[st]==''){//它相连的左边的路 更新
if (road[st]){
if (!road[i]) road[i]=road[st];
else{
if (ant_home[suf][road[st]].sum>ant_home[suf][road[i]].sum)
road[i]=road[st];
else road[st]=road[i];
}
}else if (road[i]) road[st]=road[i];
st--;
}
}
}
void workj()//处理蚁巢
{
int i=;
memset(home,,sizeof(home));
while (i<=m){
if (c[i]=='') {
int st=i;
cnt++;
while (c[i]=='') {
if(isroad[i]) {
ant_home[cur][cnt].in=true;
int _last=road[i];
if (ant_home[suf][_last].in&&ant_home[suf][_last].out)
ant_home[cur][cnt].sum=max(ant_home[cur][cnt].sum,ant_home[suf][_last].sum);
}
home[i]=cnt;
i++;
}
ant_home[cur][cnt].sum+=i-st;
}
else i++;
}
clr_suf();//滚动数组清零
last_cnt=cnt;
cnt=;
swap(cur,suf);
}
int main()
{
freopen("ant.in","r",stdin);
freopen("ant.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%s",c+);
if (i%) worki();
else workj();
}
swap(cur,suf);//******
for (int i=;i<=last_cnt;i++)
if(ant_home[cur][i].in&&ant_home[cur][i].sum>ans)
ans=ant_home[cur][i].sum;
if(ans) cout<<ans;
else cout<<-;
return ;
}
第三题 计数 大意:
长n宽m的矩阵点之间连线,问长度为 wi 的线有多少条。
解:
做到这道题,已经只有半个小时了,又没有把题读清楚,以为只有横边 和竖边,觉得好简单,到最后才发现,还有斜边,已经没有时间了。
然后,这道题的正解是数论,各种转换,我也还没弄懂,就先不写了,昨天把脚扭了,现在还痛的不行。
【56测试】【字符串】【dp】【记忆化搜索】【数论】的更多相关文章
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- [JZOJ6347]:ZYB玩字符串(DP+记忆化搜索)
题目描述 $ZYB$获得了一个神秘的非空字符串$p$. 初始时,串$S$是空的. $ZYB$会执行若干次这样的操作: $1.$选取$S$中的一个任意的位置(可以是最前面或者最后面) $2.$在这个位置 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
随机推荐
- VS 编辑并继续(转载)
转]Microsoft Visual Studio vs2008 vs2010 调试 编辑 修改 代码 在vs2008的文件菜单下,前两个菜单项分别是新建项目 和 新建网站. 这两项里,都可以建web ...
- yield return的作用
测试1: using UnityEngine; using System.Collections; public class test1 : MonoBehaviour { // Use this f ...
- Map.Entry
Map.Entry Map是java中的接口,Map.Entry是Map的一个内部接口. Map提供了一些常用方法,如keySet().entrySet()等方法,keySet()方法返回值是Map中 ...
- Tsung安装与使用
Tsung安装与使用 Tsung安装与使用的详细说明,包括测试场景的脚本配置说明 Ray 2013/11/11 目录 安装tsung Tsung运行环境安装... Tsung安装... 使用Tsu ...
- mysql show status
在LAMP架构的网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL ...
- End Routine
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Response.End()在Webform和ASP.NET MVC下的表现差异
前几天在博问中看到一个问题--Response.End()后,是否停止执行?MVC与WebForm不一致.看到LZ的描述后,虽然奇怪于为何用Response.End()而不用return方式去控制流程 ...
- poj1625Censored!(AC自动机+dp)
链接 第一次做这种题目,参考了下题解,相当于把树扯直了做DP,估计这一类题都是这个套路吧. 状态方程dp[i][next] = dp[i][next]+dp[i][j] ;dp[i][j]表示长度为i ...
- OpenGL的glTexImage2D()与gluBuild2DMipmaps()的使用方法及区别
OpenGL的glTexImage2D()与gluBuild2DMipmaps()的使用方法及区别 说明:两者的都是生成纹理,即:将载入的位图文件(*.bmp)转换成纹理贴图. 1.glTexImag ...
- Android显示基础--单位与尺寸
px:是像素的意思,屏幕可以显示的最小元素单位,单独一个像素点非常小,肉眼都无法看到. pt:是磅数的意思,1磅等于七十二分之一英寸,pt一般用作字体的单位. dp:密度无关像素的意思,也被称为dip ...