xiaoxiaoxiaoxiao_li @ 2022-07-12 21:01:17
过了本地oj,欢欢喜喜过来刷蓝题,结果100分,最后一个点爆零,只有一行的话不管有几列他只输出零求助
#include<bits/stdc++.h>
using namespace std;
long long n,m,f[120][1010][1010],st[10000],td[10000],top,mod=100000000,ans,num[100000];//f[][][],第一维当前行,第二维当前状态,第三维上一行状态
bool check(int x){
if((x&(x<<1))&&(x&(x>>1)))return 0;
if((x&(x<<2))&&(x&(x>>2)))return 0;
else return 1;
}
bool find(int x,int y){
if(x&td[y])return 0;
else return 1;
}
long count(long i){
int c=0;
while(i>0)
{
++c;
i-=i&(-i);
}
return c;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++){
td[i]=0;
char t;
for(int j=1;j<=n;j++){
cin>>t;
if(t=='H'){
td[i]+=(1<<(n-j));
}
}
}
for(int i=0;i<(1<<n);i++){
if(check(i))st[++top]=i;
}
for(int j=1;j<=top;j++){
num[j]=count(st[j]);
if(find(st[j],1)){
f[1][j][0]=num[j];
}
}
for(int i=1;i<=top;i++)
{
for(int j=1;j<=top;j++)
{
if(!find(st[i],1))continue;
if(st[i]&st[j])continue;
if(!find(st[j],2))continue;
f[2][j][i]=max(f[2][j][i],f[1][i][0]+num[j]);
}
}
for(int i=3;i<=m;i++){
for(int j=1;j<=top;j++){
if(!find(st[j],i))continue;
for(int k=1;k<=top;k++){
if(!find(st[k],i-1))continue;
if(st[j]&st[k])continue;
for(int t=1;t<=top;t++){
if(!find(st[t],i-2))continue;
if(((st[j]&st[t])==0)&&((st[t]&st[k])==0))
f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+num[j]);
}
}
}
}
for(int i=1;i<=top;i++){
for(int j=1;j<=top;j++){
ans=max(ans,f[m][i][j]);
}
}
cout<<ans;
return 0;
}
by xi_11 @ 2022-09-22 16:34:16
@xiaoxiaoxiaoxiao_li 求下第一行符合状态下的最大值,再加个特判就OK了
if(n==1){
cout<<maxn;
return 0;
}
by xi_11 @ 2022-09-22 16:39:22
@xiaoxiaoxiaoxiao_li
因为如果只有一行,应该是f[1][i][0],但0这个状况你枚举不到
by 罗逸朗 @ 2022-09-22 16:57:14
@yxh52cc 谢谢,号主被jc禁言了。我是他朋友,顺便此贴结。
by xi_11 @ 2022-09-22 17:58:01
@罗逸朗
?乐死我了(bishi
希望人没事