*炮兵阵地<pku 1185>

 
  
 // 类似 2411 状态压缩
1 Source Code
2
3 Problem: 1185 User: eth1
4 Memory: 3452K Time: 297MS
5 Language: C ++ Result: Accepted
6 Source Code
7 #include < iostream >
8 #include < cstring >
9 using namespace std;
10
11 const int N = 1 << 11 ;
12 int dp[ 101 ][ 90 ][ 90 ];
13 int graph[ 110 ];
14 struct node
15 {
16 int man,status; // geshu , zhuangtai
17 }paobing[ 90 ];
18 int len;
19 void init_() // paobing cunqu
20 {
21 len = 0 ;
22 paobing[len].man = 0 ;
23 paobing[len ++ ].status = 0 ;
24 for ( int i = 1 ;i < N;i ++ )
25 {
26 int tem = i;
27 if (((tem << 1 ) & tem) || ((tem << 2 ) & tem)) continue ;
28 paobing[len].status = i;
29 paobing[len].man = 0 ;
30 tem = i;
31 while (tem)
32 {
33 if (tem & 1 ) paobing[len].man ++ ;
34 tem >>= 1 ;
35 }
36 len ++ ;
37 }
38 }
39 int solve( int x)
40 {
41 int l = 0 ,r = len,ans = 0 ;
42 while (l <= r)
43 {
44 int mid = (l + r) >> 1 ;
45 if (paobing[mid].status > x)
46 {
47 ans = mid; r = mid - 1 ;
48 }
49 else
50 l = mid + 1 ;
51 }
52 return ans;
53 }
54 int main()
55 {
56 init_();
57 int n,m;
58 char s[ 15 ];
59 cin >> n >> m;
60 for ( int i = 0 ;i < n;i ++ )
61 {
62 cin >> s;
63 graph[i] = 0 ;
64 for ( int j = 0 ;j < m;j ++ )
65 {
66 if (s[j] == ' P ' ) graph[i] = graph[i] * 2 + 0 ; // 0
67 else graph[i] = graph[i] * 2 + 1 ; // 1
68 }
69 }
70 int len_ = solve(( 1 << m) - 1 );
71 memset(dp, 0 , sizeof (dp));
72 for ( int i = 0 ;i < len_;i ++ )
73 if ((paobing[i].status & graph[ 0 ]) == 0 ) dp[ 0 ][i][ 0 ] = paobing[i].man;
74 for ( int i = 0 ;i < len_;i ++ )
75 if ((paobing[i].status & graph[ 1 ]) == 0 )
76 for ( int j = 0 ;j < len_;j ++ )
77 if ((paobing[i].status & paobing[j].status) == 0 )
78 dp[ 1 ][i][j] = max(dp[ 1 ][i][j],dp[ 0 ][j][ 0 ] + paobing[i].man);
79 for ( int i = 2 ;i < n;i ++ )
80 for ( int cur = 0 ;cur < len_;cur ++ )
81 if (((paobing[cur].status & graph[i]) == 0 ))
82 for ( int p1 = 0 ;p1 < len_;p1 ++ )
83 if (((paobing[p1].status & paobing[cur].status) == 0 ))
84 for ( int p2 = 0 ;p2 < len_;p2 ++ )
85 if ((paobing[p2].status & paobing[cur].status) == 0 )
86 dp[i][cur][p1] = max(dp[i][cur][p1],dp[i - 1 ][p1][p2] + paobing[cur].man);
87 int ans = 0 ;
88 for ( int i = 0 ;i < len_;i ++ )
89 for ( int j = 0 ;j < len_;j ++ )
90 ans = max(dp[n - 1 ][i][j],ans);
91 cout << ans << endl;
92 return 0 ;
93 }

转载于:https://www.cnblogs.com/eth0/archive/2011/05/23/2054788.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值