<NOI2001>炮兵阵地の思路

一如既往的dp

emm调了很久

还是我太low

本来想不瞅题解,自己yy出来

然而失败了

难过

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,cnt=1,tot=0;
int map[105],dp[105][100][100],mark[105],num[105];//map保存图的0101模式//dp第i行在状态j前一行状态为k时 最多...//mark标记是否为可行状态 
char s[15];

void init()       
{
    int i,maxx=(1<<m);
    for (i=0;i<maxx;i++)
        if ( (!(i&(i<<1))) && (!(i&(i<<2))) )
        {
            mark[++tot]=i;
            int t=i;
            while(t) num[tot]+=(t&1),t>>=1;
        }
}
bool OK(int a,int b){return !(mark[a]&map[b]);}//如果有1在一块儿,!()返回0 

int main()
{
    int i,j,ans=-1;
    scanf("%d%d",&n,&m);
    memset(dp,0,sizeof(dp));
    init();
    gets(s);                                        
    for (i=1;i<=n;i++)
    {
        gets(s);
        for (j=1;j<=m;j++)
            if (s[j-1]=='H')
                map[i]+=(1<<(m-j));
    }
        
    for(i=1;i<=tot;i++) if(OK(i,1)) dp[1][i][0]=num[i],ans=max(ans,dp[1][i][0]);//预处理1行 
    
    for(i=1;i<=tot;i++)//预处理2行 
    {
        if(!OK(i,2))continue;
        for(j=1;j<=tot;j++) if(OK(j,1) && (!(mark[i]&mark[j]))) dp[2][i][j]=max(dp[2][i][j],dp[1][j][0]+num[i]),ans=max(ans,dp[2][i][j]);    
    }
                
    for(i=3;i<=n;i++)
    {
        for(int now=1;now<=tot;now++)//枚举本行 
        {
            if(!OK(now,i))continue;
            for(int last=1;last<=tot;last++)//枚举上一行 
            { 
                if(mark[now]&mark[last])continue;
                if(!OK(last,i-1))continue;
                for(int llast=1;llast<=tot;llast++)//枚举上上行 
                {
                    if( (mark[now]&mark[llast]) || (mark[last]&mark[llast]) )continue;
                    if(!OK(llast,i-2))continue;
                    dp[i][now][last]=max(dp[i][now][last],dp[i-1][last][llast]+num[now]); 
                }
            }
        }    
    }
    for(int now=1;now<=tot;now++)
        for(int last=1;last<=tot;last++)ans=max(ans,dp[n][now][last]);
    printf("%d\n",ans);
return 0;
}
点击查看丑陋の代码&注释

猜你喜欢

转载自www.cnblogs.com/pile8852/p/9296986.html