【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 ...
随机推荐
- [Effective JavaScript 笔记]第7章:并发--个人总结
前言 这一章的内容学到了事件队列和异步的API.js只是运行在其他应用程序的脚本语言.js即依赖于应用程序,也独立与应用程序.可以使它可以在多平台,多种环境上运行.ECMAScript标准中没有关于并 ...
- shell调试
sh -x set -x 中间是要调试的代码 set +x
- Scala正则和抽取器:解析方法参数
在<正则表达式基础知识>中概括了正则表达式的基础知识, 本文讲解如何使用正则表达式解析方法参数,从而可以根据 DAO 自动生成 Service. 在做 Java 项目时,常常要根据 DAO ...
- Yii2框架查询指定字段和获取添加数据的id
指定字段: $historyinfo = Healthy::find()->select(['healthy_id','pet_name','hardware_name','hardware_c ...
- C# 获取SqLite数据库表信息以及获取表内字段信息
#region 最新数据表信息显示事件 /// <summary> /// 最新数据表信息显示事件 /// </summary> /// <param name=&quo ...
- android音乐播放器(Service+ContentProvider+Broadcast+Activity四大组件完成)
1.获取音乐 1-1:获取手机中的音乐(用ContentProvider内容提供者来完成): package com.firefly.util; import java.util.ArrayList; ...
- QT笔记之VS开发程序遇到的问题
转载:http://www.cnblogs.com/li-peng/p/3644812.html 转载:http://www.cnblogs.com/csuftzzk/p/VS_Qt_Experien ...
- EXCEL计算数字、汉字、英文单元格的计数
1.数字COUNT(A1:A100)2.汉字{=SUMPRODUCT(IF(LEN(A1:A100)LENB(A1:A100),1,0)*1)}3.英文{=SUMPRODUCT(IF(ISTEXT(A ...
- jquery中,size()和length()方法有啥区别
jquery中,size()和length()方法有啥区别? size()是jQuery提供的函数,而length是属性(不带括号). jQuery提供的源代码是这样的: size: function ...
- Linux下Ruby开发配置
以CentOS为例 安装ruby:yum install ruby 安装ruby devel:yum install ruby-devel,这个装上以后,就可以使用gem安装第三方模块了 安装gem, ...