原代码:(题:APIO炮兵阵地)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 105;
int dp[maxn][maxn][maxn] , v[maxn][maxn][maxn] , vv;
int way[maxn] , sum[maxn];
int mp[maxn] , N , M;
int cnt;
int vis[11];
void init(){
for(int i = 0; i < maxn; i++){
for(int j = 0; j < maxn; j++){
for(int k = 0; k < maxn; k++) dp[i][j][k] = 0 , v[i][j][k] = 0;
}
}
vv = 1;
}
void initial(){
memset(way , 0 , sizeof way);
memset(sum , 0 , sizeof sum);
memset(mp , 0 , sizeof mp);
memset(vis , 0 , sizeof vis);
cnt = 0;
}
void readcase(){
string str;
for(int i = 0; i < N; i++){
cin >> str;
int sta = 0;
for(int j = M-1; j >= 0; j--){
if(str[j] == 'H'){
sta += (1<<j);
}
}
mp[i] = sta;
}
}
void dfs(int i , int sta , int s){
if(i >= M){
way[cnt] = sta;
sum[cnt++] = s;
}else{
int flag = 1;
for(int k = 1; k <= 2; k++){
if(i-k >= 0 && vis[i-k] != 0){
flag = 0;
break;
}
}
dfs(i+1 , sta , s);
if(flag){
vis[i] = 1;
dfs(i+1 , sta+(1<<i) , s+1);
vis[i] = 0;
}
}
}
int DP(int k , int sta1 , int sta2){
if(k >= N) return 0;
if(v[k][sta1][sta2] == vv) return dp[k][sta1][sta2];
int ans = 0;
v[k][sta1][sta2] = vv;
for(int i = 0; i < cnt; i++){
if(((way[sta1]|way[sta2]|mp[k])&way[i]) <= 0){
ans = max(ans , DP(k+1 , i , sta1)+sum[i]);
}
}
return dp[k][sta1][sta2] = ans;
}
void computing(){
dfs(0 , 0 , 0);
printf("%d\n" , DP(0 , 0 , 0));
vv++;
}
int main(){
init();
while(~scanf("%d%d" , &N , &M)){
initial();
readcase();
computing();
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 105;
int dp[maxn][maxn][maxn] , v[maxn][maxn][maxn] , vv;
int way[maxn] , sum[maxn];
int mp[maxn] , N , M;
int cnt;
int vis[11];
void init(){
for(int i = 0; i < maxn; i++){
for(int j = 0; j < maxn; j++){
for(int k = 0; k < maxn; k++) dp[i][j][k] = 0 , v[i][j][k] = 0;
}
}
vv = 1;
}
void initial(){
memset(way , 0 , sizeof way);
memset(sum , 0 , sizeof sum);
memset(mp , 0 , sizeof mp);
memset(vis , 0 , sizeof vis);
cnt = 0;
}
void readcase(){
string str;
for(int i = 0; i < N; i++){
cin >> str;
int sta = 0;
for(int j = M-1; j >= 0; j--){
if(str[j] == 'H'){
sta += (1<<j);
}
}
mp[i] = sta;
}
}
void dfs(int i , int sta , int s){
if(i >= M){
way[cnt] = sta;
sum[cnt++] = s;
}else{
int flag = 1;
for(int k = 1; k <= 2; k++){
if(i-k >= 0 && vis[i-k] != 0){
flag = 0;
break;
}
}
dfs(i+1 , sta , s);
if(flag){
vis[i] = 1;
dfs(i+1 , sta+(1<<i) , s+1);
vis[i] = 0;
}
}
}
int DP(int k , int sta1 , int sta2){
if(k >= N) return 0;
if(v[k][sta1][sta2] == vv) return dp[k][sta1][sta2];
int ans = 0;
v[k][sta1][sta2] = vv;
for(int i = 0; i < cnt; i++){
if(((way[sta1]|way[sta2]|mp[k])&way[i]) <= 0){
ans = max(ans , DP(k+1 , i , sta1)+sum[i]);
}
}
return dp[k][sta1][sta2] = ans;
}
void computing(){
dfs(0 , 0 , 0);
printf("%d\n" , DP(0 , 0 , 0));
vv++;
}
int main(){
init();
while(~scanf("%d%d" , &N , &M)){
initial();
readcase();
computing();
}
return 0;
}