社区讨论
10分求救
P2704[NOI2001] 炮兵阵地参与者 3已保存回复 17
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @lo7yuma9
- 此快照首次捕获于
- 2023/10/27 10:00 2 年前
- 此快照最后确认于
- 2023/10/27 10:00 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,s[105],ok[105],tot,dp[105][1<<11][1<<11],sum[1<<11],ans;
char p[105];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",p+1);
for(int j=1;j<=m;j++)s[i]=s[i]<<1|(p[j]=='H'?1:0);
}
for(int i=0;i<=(1<<m)-1;i++){
int t=i;
while(t){
if(t&1)sum[i]++;
t>>=1;
}
if((!(i&(i<<1)&(i<<2)))&&(!(i&(i>>1)&(i>>2))))ok[++tot]=i;
}
for(int i=3;i<=n;i++){
for(int j=0;j<=tot;j++){
int state1=ok[j];//这行
if(state1&s[i])continue;
for(int k=0;k<=tot;k++){
int state2=ok[k];//上行
if(state2&s[i-1])continue;
for(int l=0;l<=tot;l++){
int state3=ok[l];//上上行
if(state3&s[i-2])continue;
if(state3&state2&state1)continue;
dp[i][state1][state2]=max(dp[i][state1][state2],dp[i-1][state2][state3]+sum[state1]);
}
}
}
}
for(int i=0;i<=tot;i++){
for(int j=0;j<=tot;j++){
if(ok[i]&s[n])continue;
if(ok[j]&s[n-1])continue;
if(ok[i]&ok[j])continue;
ans=max(ans,dp[n][ok[i]][ok[j]]);
}
}
printf("%d\n",ans);
return 0;
}
调了好久了QwQ
回复
共 17 条回复,欢迎继续交流。
正在加载回复...