Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
算法与证明(revised)In Reply To:算法与证明 Posted by:cavatina2016 at 2020-08-01 01:14:00 设字符串S=[A1 A2 ... AN], Ai(1<=i<=N)为'{'或'}',要用最少的替换操作使S满足要求 贪心算法: 1.设res为最终替换次数 2.设P为一个堆栈,保存未被匹配的'{'的序号,初始为空 3.从A1到AN顺序扫描S 4.如果Ai='{', 则P.push(i) 5.如果Ai='}'且P不为空,则j = P.pop(),让Aj与Ai匹配 6.如果Ai='}'且P为空,则将Ai替换为'{'、P.push(i)、res++ 7.如果S扫描完毕后P中还有X个元素,则将栈顶的X/2个序号指向的'{'替换为'}',与栈底的X/2个序号指向的'{'相匹配,同时res += X/2 8.实际代码只要记录P中元素的个数就行了 证明: 1. X为偶数 设a为原字符串中'{'的个数,b为原字符串中'}'的个数; a+b=len(S)为偶数; 扫描过程中每遇到一次匹配就a--,b--;每遇到一次替换就a++,b--; 所以扫描过程中a+b始终是偶数; 扫描完成后a=X,b=0, 所以X=a+b也是偶数 2. 经过替换得到的字符串S满足要求 这是因为每个'{'有对应的'}',每个'}'也有对应的'{',且每一对配对的'{'和'}'中间的所有括号都互相配对好了 3.算法达到了所需替换次数的下限 1)当Ai='}'且P为空,说明字符串T=[A1 A2 ... Ai]里面的'}'个数比'{'多,要实现平衡,至少要吧1个'}'替换为'{'; 2)当扫描完毕后P中剩下X个元素,设栈底元素为i,则字符串Q=[Ai Ai+1 ... AN]中的'{'比'}'多X个,要实现平衡,至少要把X/2个替换掉;Q中只有Ai='{'可能在1)中替换过了,所以再把X/2个'{'替换为'}'不会造成重复计算; 于是计算出了所需替换次数的一个下限,这个下限正好是上面算法得到的结果,即最小替换次数 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator