炮兵阵地

BannerHome PageWeb ContestsProblemsRanklistStatusStatistics
 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<cctype>
 6 #include<cstdio>
 7 using namespace std;
 8 int c[100];
 9 int s[100];
10 int ans;
11 int bitmap[100];
12 int f[100][70][70],h;
13 char str[100];
14 int n,m,i,j,k;
15  void init()
16  {
17      cin>>n>>m;
18      memset(bitmap,0,sizeof(bitmap));
19      for(i=0;i<n;i++)
20       {
21           cin>>str;
22           for(j=0;j<m;j++)
23            if(str[j]=='H')bitmap[i]+=(1<<(m-j-1));//存贮数组
24            getchar();
25       }
26  }
27  void  solve()
28  {
29 
30      memset(f,0,sizeof(f));
31      for(i=0;i<n;i++)
32      {
33         if(i==0)
34          {
35              for(j=0;j<ans;j++)
36               {
37                   if(bitmap[i]&c[j])continue;
38                   f[i][j][0]=s[j];
39               }
40 
41          }
42         else if(i==1)
43              {
44                  for(j=0;j<ans;j++)
45                   {
46                       if(bitmap[i]&c[j])continue;
47                       for(k=0;k<ans;k++)
48                        {
49                            if(bitmap[i-1]&c[k])continue;
50                            if(c[j]&c[k])continue;
51                            if(f[i][j][k]<f[i-1][k][0]+s[j])
52                              f[i][j][k]=f[i-1][k][0]+s[j];
53                        }
54                   }
55              }
56         else
57         {
58          for(j=0;j<ans;j++)
59          {
60            if(bitmap[i]&c[j])continue;
61             for(k=0;k<ans;k++)
62              {
63                  if(bitmap[i-1]&c[k])continue;
64                  if(c[j]&c[k])continue;
65                   for(h=0;h<ans;h++)
66                    {
67                        if(bitmap[i-2]&c[h])continue;
68                        if(c[j]&c[h]||c[k]&c[h])continue;
69                         if(f[i][j][k]<f[i-1][k][h]+s[j])
70                           f[i][j][k]=f[i-1][k][h]+s[j];
71                    }
72              }
73        }
74      }
75      }
76      int max1=-1;
77      for(i=0;i<ans;i++)
78       for(j=0;j<ans;j++)
79         if(max1<f[n-1][i][j])
80           max1=f[n-1][i][j];
81       cout<<max1<<endl;
82  }
83  int main()
84  {
85      init();
86       ans=0;
87     for(i=0;i<(1<<m);i++)//状态压缩好像64个
88      {
89          int t=i;
90          if(i&(t<<1)||i&(t<<2))continue;
91           s[ans]=t%2;
92          while(t=(t>>1))s[ans]+=t%2;
93          c[ans++]=i;
94      }
95      solve();
96      return 0;
97  }
View Code

炮兵阵地

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 16   Accepted Submission(s) : 2
Problem Description
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
 
Input
第一行包含两个由空格分割开的正整数,分别表示N和M; 接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
 
Output
仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
 
Sample Input
5 4 PHPP PPHH PPPP PHPP PHHP
 
Sample Output
6
 
***********************************************************************************************
这个题wa了n次,个人认为主要是状态的压缩和dp方程的建立,和dp数组的初始化
***********************************************************************************************
 
原文地址:https://www.cnblogs.com/sdau--codeants/p/3235047.html