问题 E: 生成字符串(strs)
【问题描述】
假设字符串只由字符“0”,“1”,“”组成,其中字符“”表示该字符可由字符“0”或“1”替代。
现有一些字符串,根据这些字符串生成所有可生成的字符串。如:
{10,1,0 }可生成{10,01,11,00 }
{101,001,*01}可生成{101,001}
注意后一个例子中“*01”并没有生成新的字符串。
【输入格式】
第一行是两个整数m,n(1≤m≤15,1≤n≤2500)。m表示字符串的长度,n表示字符串的个数。
以下n行每行各有一个字符串。文件中各行的行首、行末没有多余的空格。
【输出格式】
一个整数,表示所能生成的字符串的个数。
【输入样例】
2 3
10
1
0
【输出样例】
4
深搜模版题+二进制
就是有时候会忘掉细节
直接贴标程
#include<bits/stdc++.h>
using namespace std;
int c[40000], ans=0;
int m, n;
char s[20];
int change(char s[]){
int ret=0;
for(int i=0; i<strlen(s); i++)
ret=(ret<<1)+s[i]-'0';
return ret;
}
void dfs(char s[], int k){
if(k==m){
int tt=change(s);
if(c[tt]==0) ans++, c[tt]=1;
return;
}
if(s[k]=='*'){
s[k]='0';
dfs(s, k+1);
s[k]='1';
dfs(s, k+1);
}else dfs(s, k+1);
}
int main(){
scanf("%d%d", &m, &n);
while(n--){
scanf("%s", s);
dfs(s, 0);
}
printf("%d\n", ans);
return 0;
}
直接下一题(对,我就是不带解释 )
问题 F: 楼梯(stair)
【问题描述】
有N级楼梯,第i级楼梯的高度是H[i]。ROBIN必须通过一系列的操作来爬楼梯,每一步,ROBIN只能做如下三个选择之一:
1、如果后一级楼梯的高度比ROBIN当前所在楼梯的高度恰好高1,那么ROBIN可以从当前楼梯爬上后一级楼梯。
2、只要ROBIN不是在第1级楼梯,如果ROBIN愿意,ROBIN可以从当前楼梯后退到前一级楼梯。
3、假如ROBIN最近K步都是在后退(不妨假设现在退到了第i级楼梯),那么ROBIN可以从当前的第i级楼梯走一步到达第j级楼梯,其中j > i,而且 满足H[j] – H[i] <= 2K。其中2K表示2的K次方。
ROBIN一开始在第1级楼梯,ROBIN至少要走多少步才能到达第N级楼梯?如果无法到达第N级楼梯,输出-1。
【输入格式】
第一行,一个整数N。(2 <= N <= 50)
第二行,N个整数,第i个整数表示第i级楼梯的高度H[i],高度是升序的。
0 <= H[i] <= 1000000000。H[1]一定等于0。

典型的dp
第i步有可能从两个地方来:1:从第i-1步(高度相差一)2:从第i-k步(2k>高度差)
代码就出来了(有一个优化:能跳就直接跳)
贴标程
#include<bits/stdc++.h>
using namespace std;
const int INF=200000;
const int N= 50+5;
int f[N], h[N], n;
int main()
{
cin>> n;
for(int i=1;i<=n; ++i) cin>> h[i];
for(int i=1; i<=n; ++i) f[i]=INF;
f[1]=0;
for(int i=1; i<=n; ++i)
{
if(h[i]-h[i-1]==1) f[i]=min(f[i], f[i-1]+1);
for(int j=1; j<=i-1; ++j)
for(int k=1; k<j; ++k)
if(h[i]-h[j-k]<=(1<<k)) {
f[i]=min(f[i], f[j]+k+1);
break;
}
}
if(f[n]==INF)cout<<-1;
else cout<< f[n]<< endl;
return 0;
}
最后一个:(好的我就是这么草率 )(毕竟这些真的没哈子好写的 )
问题 G: 迷宫(migong)
时间限制: 1 Sec 内存限制: 128 MB
提交: 37 解决: 24
[提交][状态][讨论版][命题人:admin]
题目描述
【问题描述】
小刚在迷宫内,他每步只能往上下左右相邻的格子移动一格,且不能走出迷宫范围。他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。
【输入】
输入文件migong.in共n+1行。
第一行有三个数n,m表示迷宫有n行,m列。
第2行到第n+1行,每行m个字符,可能是’A’…’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’…’Z’也可以走。
【输出】
输出文件migong.out共1行,就是至少走几步可以按规定走完,如果不行,输出“Impossible”

宽搜+细节(预处理等)(其实真的就是一道裸宽搜 )
#include<bits/stdc++.h>
#include<queue>
using namespace std;
const int N=105;
struct node{
int x, y;
};
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int step[N][N], visit[N][N];
node a[30];
char G[N][N];
int n, m, ans;
int bfs(char st, char ed){
memset(visit, 0, sizeof(visit));
memset(visit, 0, sizeof(step));
queue<node> q;
node tmp;
tmp.x= a[st-'A'].x;
tmp.y= a[st-'A'].y;
q.push(tmp);
visit[tmp.x][tmp.y]=1;
step[tmp.x][tmp.y]=0;
while(!q.empty()){
node now= q.front();
q.pop();
for(int i=0; i<4; ++i){
int nx=now.x+dx[i];
int ny=now.y+dy[i];
if(nx<1||nx>n||ny<1||ny>m||visit[nx][ny]||G[nx][ny]=='2') continue;
step[nx][ny]= step[now.x][now.y]+1;
tmp.x=nx, tmp.y=ny;
visit[nx][ny]=1;
q.push(tmp);
if(nx==a[ed-'A'].x&&ny==a[ed-'A'].y) return step[nx][ny];
}
}
return -1;
}
char maxa;
int main(){
cin>> n>> m;
for(int i=1; i<=n; ++i)
for(int j=1; j<=m; ++j)
{
cin>> G[i][j];
if(G[i][j]>='A'&&G[i][j]<='Z'){
a[G[i][j]-'A'].x= i;
a[G[i][j]-'A'].y= j;
maxa=max(maxa, G[i][j]);
}
}
for(char st='A'; st<maxa; st++)
{
int tt=bfs(st, st+1);
if(tt==-1) {
cout<<"Impossible";
return 0;
}
ans+=tt;
}
ans+=bfs(maxa,'A');
cout<< ans<< endl;
return 0;
}
好的就酱
其实我蛮想不用queue而直接用一个数组代替(如果空间允许)(毕竟手打的安心点)(就我这水平就想手打STL了 )
820



被折叠的 条评论
为什么被折叠?



