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 }

 

你可能感兴趣的:(poj)