链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983
题意:
给定9个血槽,有三种物品,每次可以把连续相同的物品抵消掉,但是只有把连续三个的物品抵消才有价值,问你用哪种方案,能够使获得的价值最大。
思路:
暴力就行,总有6种方案,维护一个最大值即可。
代码:
#include <iostream> #include <map> #include <vector> #include <cstring> using namespace std; vector<char>ss; bool vis[5]; vector<int>qq; int ans=0; map<int,char>mp; void dfs(int u) { if(qq.size()==3) { int sum=0; vector<char>s; for(int i=0;i<ss.size();i++) { s.push_back(ss[i]); } for(int i=0;i<qq.size();i++) { for(int j=0;j<s.size();j++) { if(j+2<s.size()) { if(s[j]==s[j+1]&&s[j+1]==s[j+2]&&s[j]==mp[qq[i]]) { sum++; } } } int kk=3; while(kk--) { for(int j=0;j<s.size();j++) { if(s[j]==mp[qq[i]]) { s.erase(s.begin()+j); break; } } } } ans=max(ans,sum); return ; } for(int i=0;i<=2;i++) { if(!vis[i]) { vis[i]=true; qq.push_back(i); dfs(i); qq.pop_back(); vis[i]=false; } } } int main() { int t; char s1; mp[0]='g'; mp[1]='o'; mp[2]='a'; cin>>t; while(t--) { ss.clear(); for(int i=1;i<=9;i++) { cin>>s1; ss.push_back(s1); } ans=0; vector<char>w(ss.begin(),ss.end()); int sum3=0; for(int i=0;i<w.size();i++) { if(i+2<w.size()&&w[i]==w[i+1]&&w[i+1]==w[i+2]) { sum3++; } } ans=sum3; for(int i=0;i<=2;i++) { memset(vis,false,sizeof(vis)); vis[i]=true; qq.clear(); qq.push_back(i); dfs(i); } cout<<ans<<endl; } return 0; }