G_X_J @ 2018-10-22 00:00:26
如题,wa40分,第二个点输出331,答案333。 谢谢!
// luogu-judger-enable-o2
#include <iostream>
#include <map>
#include <queue>
#include <cstring>
using namespace std;
int n,m,s[1011];
typedef pair<int,int> par;
vector<par>st;
void dfs(int now,int cnt,int pos)//预处理所有的状态转移过程
{
if(pos<m)
dfs(now,cnt,pos+1),dfs((now+(1<<pos)),cnt+1,pos+3);
else
st.push_back(par(now,cnt));
}
int f[2][1100][1100];//滚动数组
//DP状态定义:f[i][j][k]表示当前行状态j,下一行为状态为k,再下一行编号为i的状态,从后向前递推
//状态压缩定义:当一个位置可以放置炮兵,对应位为0,否则为1
int main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
string tmp;
cin>>tmp;
for(int j=0;j<m;j++)
if(tmp[j]=='H')
s[i]+=(1<<j);
}
s[n+2]=s[n+1]=(1<<m)-1;
dfs(0,0,0);
for(int i=n+2;i>=3;i--)//i为next
{
memset(f+(i%2),0,sizeof(f+i%2));
//枚举所有可能合法状态
//f[i%2][state[i-2]][state[i-1]]
for(int j=0;j<st.size();j++)
{
for(int q=0;q<st.size();q++)
{
int sta=((s[i-2]|st[j].first)|st[q].first);//基于地形的所有可能状态
int stb=(s[i-1]|st[q].first);
for(int k=0;k<st.size();k++)
{
if((sta&(st[k].first))!=0)//当前转移过程在不能放置炮兵的地方放置了炮兵
continue;
int &ans=f[i%2][sta][stb]=0;
int trans=st[k].first,cnt=st[k].second;
ans=max(ans,f[(i+1)%2][stb|trans][s[i]|trans]+cnt);
}
}
}
}
cout<<f[1/*即3%2*/][s[1]][s[2]];
return 0;
}
/*
样例:
100 10
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPHPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PHPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPHPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPHPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPHPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
PPPPPPPPPP
*/
by 可比百分 @ 2018-11-07 16:49:32
@G_X_J
……我也是第二个点输出331……