蒟蒻求助
查看原帖
蒟蒻求助
251130
lovely_ckj楼主2021/5/17 18:34

50 pts:

#include <iostream>
#include <cstdio>

using namespace std;

int n,m,dp[2][10005][10005];

struct line
{
    bool dat[15];
    int num[10005],cnt[10005],sum;
}a[105];

void init(int wh,int pos,int now,int cnt)
{
    if(pos>m)
    {
        a[wh].num[++a[wh].sum]=now;
        a[wh].cnt[a[wh].sum]=cnt;
        return;
    }
    init(wh,pos+1,now,cnt);
    if(a[wh].dat[pos])
    {
        init(wh,pos+3,now|(1<<(pos-1)),cnt+1);
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char ch;
            scanf(" %c",&ch);
            if(ch=='P')
            {
                a[i].dat[j]=true;
            }
        }
        init(i,1,0,0);
    }
    for(int i=1;i<=a[1].sum;i++)
    {
        dp[1][i][0]=a[1].cnt[i];
    }
    for(int i=1;i<=a[1].sum;i++)
    {
        for(int j=1;j<=a[2].sum;j++)
        {
            if(a[1].num[i]&a[2].num[j])
            {
                continue;
            }
            dp[0][j][i]=dp[1][i][0]+a[2].cnt[j];
        }
    }
    for(int i=3;i<=n;i++)
    {
        for(int j=1;j<=a[i].sum;j++)
        {
            for(int k=1;k<=a[i-1].sum;k++)
            {
                for(int l=1;l<=a[i-2].sum;l++)
                {
                    if(
                    (a[i-1].num[k]&a[i-2].num[l])
                    ||(a[i].num[j]&a[i-1].num[k])
                    ||(a[i].num[j]&a[i-2].num[l])
                    )
                    {
                        continue;
                    }
                    dp[i%2][j][k]=dp[(i-1)%2][k][l]+a[i].cnt[j];
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=a[n].sum;i++)
    {
        for(int j=1;j<=a[n-1].sum;j++)
        {
            ans=max(ans,dp[n%2][i][j]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

求路过大佬帮忙找找 bug

2021/5/17 18:34
加载中...