• [第一场(2)]retro


    题目描述
    小Mirko在圣诞节得到了一个游戏机,这个游戏机既不是PlayStation4,也不是Xbox One,而是Atari 2600。这个游戏机附带了一款免费游戏,游戏的主角站在屏幕底部,屏幕上其余部分分散着各种各样的物体向底部坠落。 更准确的说,屏幕可以表示为一个R行S列排列组成的RX像素网格。主角站在最下面一行的一个像素中,用‘M’标记,其余像素用另外一些符号标记:‘.’(空格)、‘’(炸弹)、‘(’(左括号)或‘)’(右括号)。 主角可以在一次移动中,向左或向右移动一个像素或者不移动,与此同时,其他物体同时向下移动一个像素(可能会从屏幕上消失)。当主人公发现自己和其中一个括号同处一个位置是,我们就拿起那个括号,并将它添加到获得的括号数组的末尾。主角的目标是获得尽可能长的有效括号表达式。 有效括号表达式是通过以下方式归纳定义的: ·“()”是有效表达式 ·如果a是有效表达式,那么“(a)”也是有效表达式。 ·如果a和b都是有效表达式,那么“ab”也是有效表达式。 当主角发现自己同炸弹一个位置或所有物体掉出屏幕时,游戏结束。
    输入格式
    第一行输入两个正整数R、S(1≤R,S≤300),表示像素格的行列数。 接下来输入一个R行S列的地图,每个格子包含‘M’,‘.’,‘*’,‘(’,‘)’这五种中的一种字符。 数据保证至少可以获得一个有效括号表达式。
    输出格式
    第一行输出一个数字,表示有效括号表达式的数量。 第二行输出这个括号表达式。如果有多个答案,输出字典序最小的那一个。
    样例
    样例输入1

    5 4
    …).
    .)(.
    (.)*
    (.
    …M.
    样例输出1

    4
    (())
    样例输入2

    6 3
    )(.

    (
    *
    )()
    ().
    M…
    样例输出2

    4
    ()()
    样例输入3

    6 3
    ((.

    (
    *
    )()
    ().
    M…
    样例输出3

    2
    ()
    数据范围与提示
    第一组样例走法:左、左、右、右 第二组样例走法:不动、不动、不动、右、左 第三组样例走法:不动、不动、右

    解题思路

    我们可以发现,一个点可以由三个不同状态转移过来,所以,肯定选择DP,搜索的话就不能够标记。
    我们先从上往下走。把左括号看作1,右括号看作-1,点就不管它。
    定义dp[i][j][k]表示i行j列所组成的式子的差值。这是肯定没有负数存在的。不会存在不合理的转移,我们就保证了组成的式子一定是合理的,最多存在左括号多余。
    于是,最长我们求了出来。
    然后,我们求序列,原来的定义就反着来,看哪些符合。bfs即可。
    但存在一个优先级的问题,我们应该要优先走点,这样左括号就一直留在上面了,字典序较小,然后优先走左括号,最后才走右括号。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<vector>
    #include<cstdlib>
    using namespace std;
    char mase[305][305];
    int val(char s){
    	if (s == '.')
    		return 2;
    	if (s == '(')
    		return 1;
    	if (s == ')')
    		return 0;
    }
    struct node{
    	int x,y,len,hop;
    	node(){};
    	node(int X,int Y,int H,int L){
    		x = X,y = Y,len = L,hop = H;
    	}
    	bool operator < (const node &a)const {
    		if (len == a.len)
    			return val(mase[x][y]) < val(mase[a.x][a.y]);
    		else 
    			return len < a.len;
    	}
    };
    int r,s,sx,sy,dp[305][305][305],mov1[5] = {0,1,0,-1};
    string ans;
    bool vis[305][305][305];
    void bfs(){
    	priority_queue<node>Q;
    	vis[sx][sy][0] = 1;
    	Q.push(node(sx,sy,0,dp[sx][sy][0]));
    	while (!Q.empty()){
    		node p = Q.top();
    		Q.pop();
    		if (mase[p.x][p.y] == ')' && ans[p.len] == '(')
    			continue;
    		if (mase[p.x][p.y] == '(' || mase[p.x][p.y] == ')')
    			ans[p.len] = mase[p.x][p.y];
    		if (p.x == 1)
    			continue;
    		for (int i = 1;i <= 3;i ++){
    			int tox = p.x - 1;
    			int toy = p.y + mov1[i];
    			if (tox <= 0 || tox > r || toy <= 0 || toy > s || mase[tox][toy] == '*')
    				continue;
    			if (mase[p.x][p.y] == '('){
    				if (!vis[tox][toy][p.hop + 1] && dp[tox][toy][p.hop + 1] == p.len - 1){
    					vis[tox][toy][p.hop + 1] = 1;
    					Q.push(node(tox,toy,p.hop + 1,p.len - 1));
    				}
    			}
    			else if (mase[p.x][p.y] == ')'){
    				if (p.hop >= 1){
    					if (dp[tox][toy][p.hop - 1] == p.len - 1 && !vis[tox][toy][p.hop - 1]){
    						vis[tox][toy][p.hop - 1] = 1;
    						Q.push(node(tox,toy,p.hop - 1,p.len - 1));
    					}
    				}
    			}
    			else {
    				if (dp[tox][toy][p.hop] == p.len && !vis[tox][toy][p.hop]){
    					vis[tox][toy][p.hop] = 1;
    					Q.push(node(tox,toy,p.hop,p.len));
    				}
    			}
    		}
    	}
    }
    int main(){
    	memset(dp,-1,sizeof(dp));
    	scanf ("%d%d",&r,&s);
    	for (int i = 1;i <= r;i ++){
    		scanf ("
    ");
    		for (int j = 1;j <= s;j ++){
    			scanf ("%c",&mase[i][j]);
    			if (mase[i][j] == 'M')
    				sx = i,sy = j;
    		}
    	}
    	for (int i = 1;i <= s;i ++){
    		if (mase[1][i] == ')')
    			dp[1][i][1] = 1;
    		if (mase[1][i] == '.')
    			dp[1][i][0] = 0;
    	}
    	for (int i = 1;i <= r;i ++){
    		for (int j = 1;j <= s;j ++)
    			if (mase[i][j] == '*')
    				dp[i][j][0] = 0;
    	}
    	for (int i = 1;i < r;i ++){
    		for (int j = 1;j <= s;j ++){
    			for (int k = 0;k <= r / 2;k ++){
    				if (dp[i][j][k] == -1)
    					continue;
    				for (int l = 1;l <= 3;l ++){
    					int tox = i + 1;
    					int toy = j + mov1[l];
    					if (tox <= 0 || tox > r || toy <= 0 || toy > s || mase[tox][toy] == '*')
    						continue;
    					if (mase[tox][toy] == '('){
    						if (k > 0)
    							dp[tox][toy][k - 1] = max(dp[tox][toy][k - 1],dp[i][j][k] + 1);
    					}
    					else if(mase[tox][toy] == ')')
    						dp[tox][toy][k + 1] = max(dp[tox][toy][k + 1],dp[i][j][k] + 1);
    					else 
    						dp[tox][toy][k] = max(dp[tox][toy][k],dp[i][j][k]);	
    				}
    			}
    		}
    	}
    	printf("%d
    ",dp[sx][sy][0]);
    	bfs();
    	for (int i = dp[sx][sy][0];i >= 1;i --)
    		printf("%c",ans[i]);
    }
    
  • 相关阅读:
    Sublime Text 3 快捷键精华版
    css动画+滚动的+飞舞的小球
    css动画+照片清晰度动画
    simhash
    抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
    不逃离WIndows,Asp.Net就只能写写进销存管理系统
    吸引下百度蜘蛛
    Arcpy功能总结
    英雄杀
    NCEP Datasets
  • 原文地址:https://www.cnblogs.com/lover-fucker/p/13566659.html
Copyright © 2020-2023  润新知