【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 ...
随机推荐
- 【C解毒】怎样写main()函数
[C解毒]怎样写main()函数(出处: CUNIX论坛)
- core animation (转)
iOS Core Animation 简明系列教程 看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽快 ...
- iconfont-矢量图标字体的运用
发现一个奇怪的现象:(http://m.muzhiwan.com) 这里面的图标竟然不是一张张小图标图片?Firebug下查看一下元素,竟然是这样的: 页面源代码如下: 好奇怪啊,这些个乱七八糟的&a ...
- [转]使用xcode4 workspace 多个project协同工作
转载地址:http://erlangprogram.com/use-xcode4-workspace 一般的某个应用单独新建一个 project 就可以了,然后把所有的程序文件都放在里面,这个可以 ...
- Android 网络框架 volley源码剖析
转载请注明出处: http://blog.csdn.net/guolin_blog/article/details/17656437 经过前三篇文章的学习,Volley的用法我们已经掌握的差不多了, ...
- noi 9265 取数游戏
题目链接:http://noi.openjudge.cn/ch0206/9265/ 题意:从自然数1到N中不取相邻2数地取走任意个数,问方案数. 解法:f[i][1]表示在前i个数中选了第i个的方案数 ...
- vs2015手动安装xamarin
1.安装jdk Download the Java JDK v1.7.0 installer to any directory on your disk, double-click the downl ...
- Python Locust性能测试框架实践
[本文出自天外归云的博客园] Locust的介绍 Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试. Locust的安装 首先你要安装pyth ...
- python学习之while语句
while循环 1.简单的while循环while True: ")#这是一个简单的while循环,当等于True时会一直打印1 2.while执行多少次后退出 coun=0while Tr ...
- 2016年12月21日 星期三 --出埃及记 Exodus 21:16
2016年12月21日 星期三 --出埃及记 Exodus 21:16 "Anyone who kidnaps another and either sells him or still h ...