雪绮晶 @ 2018-08-25 19:55:27
rt,这状压dp好毒瘤啊…………
#include<stdio.h>
#include<algorithm>
using namespace std;
int ans;
int dp[105][(1<<11)+5][(1<<11)+5],n,m;
char c;
int num[(1<<11)+5],s[(1<<11)+5];
int states,i;
int map[(1<<11)+5];
int count(int n) {
int ans=0;
while(n)
{
if((n&1)==1)
ans++;
n>>=1;
}
return ans;
}
int main ()
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
c=getchar();
if(c=='H')
{
map[i]+=1<<j;
}
}
getchar();
}
for(i=0; i<(1<<m); i++)
{
if(((i&(i<<1))==0)&&((i&(i<<2))==0)&&((i&(i>>1))==0)&&((i&(i>>2))==0))
{
num[++states]=count(i);
s[states]=i;
}
}
for(int j=0; j<(1<<m); j++)
{
if(j&map[i])
continue;
if(j&(j<<1))
continue;
if(j&(j<<2))
continue;
dp[0][j][0]=num[j];
}
for(int j=0; j<states; j++)
{
for(int k=0; k<states; k++)
{
if(s[j]&s[k])
continue;
if(s[j]&map[2])
continue;
dp[2][k][j]=max(dp[2][k][j],dp[1][0][j]+num[j]);
}
}
for(int i=3; i<=n; i++)
{
for(int j=0; j<states; j++)
{
if(map[i]&s[j])
continue;
for(int k=0; k<states; k++)
{
if(s[k]&s[j])
continue;
for(int w=0; w<states; w++)
{
if(s[w]&s[k])
continue;
if(s[w]&s[j])
continue;
dp[i][k][j]=max(dp[i][k][j],dp[i-1][w][k]+num[j]);
}
}
}
}
for(int i=1; i<=states; ++i)
for(int j=1; j<=states; ++j)
ans=max(dp[n][i][j],ans);
printf("%d",ans);
return 0;
}
by 雪绮晶 @ 2018-08-25 19:57:17
我是萌新,刚学OI,求帮助qwq
by 雪绮晶 @ 2018-08-25 19:59:37
@陶文祥 @Miku初音 @AC我最萌
大佬,江湖救急啊!
by 雪绮晶 @ 2018-08-25 20:00:43
@陆麟瑞666
by 06ray @ 2018-08-25 20:01:06
现在刚学OI的都能AKIOI了
by 雪绮晶 @ 2018-08-25 20:01:57
@陆麟瑞666
这次省赛看我如何花式爆零qwq
by twelveZ @ 2018-08-25 21:54:15
@雪绮晶 前排卖船
by ciwomuli @ 2018-08-25 21:57:41
第一个bug
map[i]+=1<<j;
状压从零位开始
此处应为j-1
by ciwomuli @ 2018-08-25 22:00:36
@雪绮晶
你的状压好魔性啊
by 雪绮晶 @ 2018-08-25 22:00:42
@ciwomuli (⊙o⊙)哦谢谢大佬
by 雪绮晶 @ 2018-08-25 22:01:38
@ciwomuli 毒瘤题都这样qwq