第一题:神秘大门 大意:

  两个字符串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】【记忆化搜索】【数论】的更多相关文章

  1. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  2. 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. ...

  3. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  4. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  5. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  6. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  7. POJ 1088 DP=记忆化搜索

    话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...

  8. [JZOJ6347]:ZYB玩字符串(DP+记忆化搜索)

    题目描述 $ZYB$获得了一个神秘的非空字符串$p$. 初始时,串$S$是空的. $ZYB$会执行若干次这样的操作: $1.$选取$S$中的一个任意的位置(可以是最前面或者最后面) $2.$在这个位置 ...

  9. loj 1044(dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...

  10. [hihocoder 1033]交错和 数位dp/记忆化搜索

    #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...

随机推荐

  1. 设置IE默认文本模式的方法

    设置IE默认文本模式的方法 <meta http-equiv="X-UA-Compatible" content="IE=8" /> IE=5.6. ...

  2. android项目的结构和布局

    一.res文件夹 1.res文件夹用于存放Android的资源.包括:动画.静态图片.字符串.菜单.布局.视频.文件等. 1.drawable-ldpi:低分辨率图形(120像素/英寸) 2.draw ...

  3. 20160330001 调用及触发Office Outlook 约会

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  4. iptables命令详解和举例

    网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助.网管员的安全意识要比空喊Linux安全重要得多. iptables -Fiptables -Xiptables -F ...

  5. Linux下环境变量设置

    分类 Linux下的环境变量按生存周期来划分,可以划分为两种: 1)永久的:需要修改配置文件, 变量永久生效 2)临时的:直接在终端使用export命令声明即可,但是关闭shell后失效. 设置方法 ...

  6. Python学习笔记(2)

    变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,它会存储在存储中,称之为变量(Variable),在大多数语言中,都把这种行为称为“给变量赋值”或“把值存储在变量中”. 而Python与 ...

  7. WIN10图标显示异常

    1.打开控制面板,右上边查看方式选择边小图标显示 2.打开显示里面的自定义缩放级别 3.设置级别为125%  然后点击 应用 4.注销或者重启,然后将异常的快捷方式点击打开,就会恢复正常,至少我的是回 ...

  8. Oracle数据备份bat

    @echo on setlocal rem 设置数据库和备份文件参数... set sid=testorcl set username=testname set password=testpwd se ...

  9. HDU-4526 威威猫系列故事——拼车记 动态规划

    分析:该题有2个地方要注意:所有的车要么不坐要么就坐满,这个贪心策略很容易证明是正确的,还有一点就是最后一辆车除外. #include <cstdlib> #include <cst ...

  10. Linux_命令_积累

    1.ps 查看进程状态 ZC: "ps -a" 和 "ps a" 有区别... (具体查看 "man ps") 1.1.ps aux 1.2 ...