【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 ...
随机推荐
- WPF:常见问题
1.自定义Main函数 背景: wpf 默认的Main函数在 App.g.cs文件中,在App.xmal.cs内自定义Main函数后冲突. 解决方法: 法一: 1)新建class1.cs类,在其中设置 ...
- 如何清理photoshop cs6 被升级的烦人的adobe creative cloud组件
安装photoshop cs6(虽然目前已经退出到cc 2015,不过因激活成熟度等,我还是偏向于使用cs6,够用!),默认安装adobe application manager. 不过如果不小心单独 ...
- 使用Netty收发二进制报文问题记
1.java二进制编解码 byteBuffer.flip() byteBuffer.getInt() 与 byteBuf.getInt(11) 2.粘包拆包问题 LengthFieldBasedFra ...
- 使用异步js解决模态窗口切换的办法
核心代码 js ="setTimeout(function(){document.getElementsByTagName('Button')[3].click()},100);" ...
- IntelliJ IDEA14 配置 SVN
最新升级IDEA13到14版本,升级后发现IDEA中SVN无法正常使用,但文件夹下能够正常使用. 并且报错:svn: E204899: Cannot run program "svn&quo ...
- Spring MVC 线程安全问题的思考
Spring MVC 线程安全问题的思考 在读一些博文的时候发现有些文章对SpringMVC的Controller线程安全的验证并不正确,比如没有探究controller线程不安全的具体原因,比如将请 ...
- chrome的timeline中stalled问题解析
原文地址 :http://foio.github.io/chrome-stalled/ 在公司国做一个运营活动,上线后PM总是抱怨访问速度过慢,影响运营效果.然而从前端的角度来说我已经做了如下优化: ...
- createjs 的 bitmapdata类
今天测试一个功能,在效率上出现了问题.2D舞台绘制了大量的元素,联想到AS3的 bitmapdata.darw() 功能,遗憾是createjs官方类 中没有bitmapdata类. 好在已经有大神替 ...
- (九)errno和perror、标准IO
3.1.6.文件读写的一些细节3.1.6.1.errno和perror(1)errno就是error number,意思就是错误号码.linux系统中对各种常见错误做了个编号,当函数执行错误时,函数会 ...
- Android 控件知识点
一.引入布局 在xml文件中引入另一个布局 <include layout="@layout/XXX" /> 个人理解就是在父布局的某个位置在嵌套一个布局. 二.自定义 ...