E. Expand the Path- Codeforces

E. Expand the Path- Codeforces

网上找这题好像没有很多题解,所以来发一篇我自己的解法

题目大意:

​ 有n*n的矩阵, 给一个由DR构成的路径序列,分别表示向下走和向右走。可以将任意数量任意位置的R或者D替换成RR或者DD。不论怎么走,不能超出矩阵范围,问路径最多能覆盖到多少点。

思路和代码:

能覆盖到多少点有点难思考我觉得。所以反过来,会有多少点不可能被覆盖呢。

首先特殊情况:只出现了D或者R那就只有一条直的路径,ans为n。

一般情况,分成向下延申和向右延申(对称的,后面以向下为例)。

举个栗子,假设操作串s=RDRR。

1)我们要计算某个点向下延申后该列最少会剩下多少格不可能被覆盖就需要知道该点之后的D的数量(不包括该点)

2)当然上面的规律放在RD这个例子里是不成立的。我们在向下延申的时候需要前面出现过D。若前面没有出现过D,那就不能向下延申,则空白格数量就是n-1。

3)只有在i到了串尾或s[i + 1]为'R'的时候才需要结算该列的空白格子。因为当后一个仍是D的时候,还没有到最下方。

ll get(string &s , char x){
	ll suf = 0 , res = 0 ;
	for(auto c : s)suf += c == x ;
	
	bool fpre = 0 ;
	rep(i , 0 , s.size() - 1){
		if(s[i] == x){
			fpre = 1 ;
			suf -- ;
		}
		if(i == s.size() - 1 || s[i + 1] == (x == 'D' ? 'R' : 'D'))
			res += fpre ? suf : n - 1 ;
		//结算
	}
	
	return res ;
}

ll solve(){
	cin >> n ;
	
	string s ; cin >> s ;
	
	s = "0" + s ;

	ll numd = 0 , numr = 0 ;
	for(char c : s){
		if(c == 'D') numd ++ ;
		if(c == 'R') numr ++ ;
	}
	if(numd == 0 || numr == 0) return n ;
	return n * n - get(s , 'D') - get(s , 'R') ;
	
}//code_by_tyrii 
小结:

a 需要对操作过程有一个清晰的把握,就像这里的操作串S。最好是从1开始做下标,0操作往往是有意义的。认清在第几次操作,在这里应该做什么往往会对解题有帮助。

b 正难则反

c 初始情况和一般情况往往是不一样的,需要仔细考虑。

posted @   tyrii  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示