POJ1185 炮兵阵地

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <map>
  5 using namespace std;
  6 int m,n;
  7 vector<int> warMap;
  8 
  9 map<int,int> LineStatus;
 10 int EndData;
 11 struct KeyVal
 12 {
 13     int key;
 14     int val;
 15 public:
 16     KeyVal(int k,int v):key(k),val(v)
 17     {
 18 
 19     }
 20 };
 21 struct KeyVec
 22 {
 23     int key;
 24     vector<KeyVal> val;
 25 public:
 26     KeyVec(int k):key(k)
 27     {
 28 
 29     }
 30     KeyVec(int k,vector<KeyVal>& v):key(k),val(v)
 31     {
 32 
 33     }
 34 };
 35 typedef vector<KeyVec> PreStatus;
 36 typedef vector<KeyVal> ST;
 37 int GetNum(int val)
 38 {
 39     int result=0;
 40     for (int i=0;i<m;++i)
 41     {
 42         result+=(val>>i)&1;
 43     }
 44     return result;
 45 }
 46 
 47 bool check(int val)
 48 {
 49     if ((val&(val>>2))||(val&(val>>1)))
 50     {
 51         return false;
 52     }
 53     else
 54     {
 55         return true;
 56     }
 57 }
 58 void GetLine(int val,int step,map<int,int>& result)
 59 {
 60     if (step>=m)
 61     {
 62         result.insert(make_pair(val,GetNum(val)));
 63     }
 64     else
 65     {
 66         int tmp=val|(1<<step);
 67         if (check(tmp))
 68         {
 69             GetLine(tmp,step+1,result);
 70         }
 71         GetLine(val,step+1,result);
 72     }
 73 }
 74 void GetUsefulStatus(int i,ST& UsefulStatus)
 75 {
 76     for (map<int,int>::iterator iter=LineStatus.begin();iter!=LineStatus.end();++iter)
 77     {
 78         if (!((iter->first)&warMap[i]))
 79         {
 80             UsefulStatus.push_back(KeyVal(iter->first,iter->second));
 81         }
 82     }
 83 }
 84 
 85 void DP(int step,PreStatus& p)
 86 {
 87     if (step>=n)
 88     {
 89         for (PreStatus::iterator iter=p.begin();iter!=p.end();++iter)
 90         {
 91             for (ST::iterator it2=iter->val.begin();it2!=iter->val.end();++it2)
 92             {
 93                 if (it2->val>EndData)
 94                 {
 95                     EndData=it2->val;
 96                 }
 97             }
 98         }
 99     }
100     else
101     {
102         ST ussta;
103         GetUsefulStatus(step,ussta);
104         PreStatus p2;
105         p2.reserve(60);
106         for (ST::iterator iter=ussta.begin();iter!=ussta.end();++iter)
107         {
108             ST pre;
109             pre.reserve(60);
110             for (PreStatus::iterator itP1=p.begin();itP1!=p.end();++itP1)
111             {
112                 if (iter->key&itP1->key)
113                 {
114                     continue;
115                 }
116                 int num=0;
117 
118                 for (ST::iterator itP2=itP1->val.begin();itP2!=itP1->val.end();++itP2)
119                 {
120                     if ((!(iter->key&itP2->key))&&(itP2->val>num))
121                     {
122                         num=itP2->val;
123                     }
124                 }
125                 pre.push_back(KeyVal(itP1->key,iter->val+num));
126             }
127             if (pre.size()>0)
128             {
129                 p2.push_back(KeyVec(iter->key,pre));
130             }
131         }
132         DP(step+1,p2);
133     }
134 }
135 int main()
136 {
137     cin>>n>>m;
138     for (int i=0;i<n;++i)
139     {
140         string tmp;
141         cin>>tmp;
142         int res=0;
143         for (int j=0;j<tmp.size();++j)
144         {
145             if (tmp[j]-'H'==0)
146             {
147                 res=res|(1<<j);
148             }
149         }
150         warMap.push_back(res);
151     }
152     GetLine(0,0,LineStatus);
153     PreStatus pre;
154     KeyVal ppre(0,0);
155     KeyVec kv(0);
156     kv.val.push_back(ppre);
157     pre.push_back(kv);
158     DP(0,pre);
159     cout<<EndData<<endl;
160 }
原文地址:https://www.cnblogs.com/mandaren/p/3364236.html