这道题的特点在于,我们不管确定哪一个点的位置,所有其他位置的权值是一定的,所以我们秩序按照一个深度标准换算所有点的值,相同的最多值就是需要修改最少的方案,具体代码可以直接用map来维护。
#include<bits/stdc++.h> using namespace std; string s; map<long long,int>Q;//因为如果任何一个节点的值确定,其他所有值都会确定,所以我们按深度给不同节点不同值换算到同一维度,然后在比较那个值出现次数最多就可以统计出需要修改的最小次数 int sum; void DFS(int depth,int s1,int e1) //深度,遍历起点与终点 { if(s[s1]==‘[‘) { int p=0; for(int i=s1+1;i!=e1;i++) { if(s[i]==‘[‘) p++; if(s[i]==‘]‘) p--; if(s[i]==‘,‘&&p==0) //每遇到一个根都会做相应的dfs处理 { DFS(depth+1,s1+1,i-1); DFS(depth+1,i+1,e1-1); } } } else { long long w=0; for(int i=s1;i<=e1;i++) w=w*10+s[i]-‘0‘; //读取连续数字 sum++; Q[w<<depth]++; //映射的值会加一 } } int main() { int T; cin>>T; while(T--) { cin>>s; sum=0; Q.clear(); DFS(0,0,s.length()-1); int maxsum=0; for(auto it=Q.begin();it!=Q.end();it++) { if(it->second>maxsum) maxsum=it->second; } int ans=sum-maxsum; cout<<ans<<endl; } return 0; }
原文:https://www.cnblogs.com/tscjj/p/13769885.html