社区讨论

样例错误求调(玄关 码风优良)

P2704[NOI2001] 炮兵阵地参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lz2k7frz
此快照首次捕获于
2024/07/26 18:28
2 年前
此快照最后确认于
2024/07/26 19:37
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 100;
const int N = 1e5 + 100;
int a[N];
int mp[200][200] , fmap[105][200] ;
int dp[105][200][200];
int flag[N] , can[N] , cnt , num[N];
int n , m;
void init()
{
    int len = (1 << m);
    for(int i = 0 ; i < len ; i ++)
    {
        int f1 = (i << 1) & i;
        int f2 = (i << 2) & i;
        if(!f1 && !f2)
        {
            flag[i] = 1;
            int k = i;
            while(k)
            {
                num[cnt] ++;
                k -= k & -k;
            }
            can[cnt++] = i;
        }
    }
}
signed main(){
    scanf("%d%d" , &n , &m);
    init();
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 1 ; j <= m ; j ++)
        {
            char c;
            cin >> c;
            if(c == 'P')
            {
                mp[i][j] = 1;
            }
        }
    }
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 0 ; j < cnt ; j ++)
        {
            int f = 1 , l = 1 , s = can[j];
            while(s)
            {
                if((s & 1) && (mp[i][l] == 0))
                {
                    f = 0;
                    break;
                }
                s >>= 1;
                l ++;
            }
            if(f)
            {
                fmap[i][j] = 1;
            }
        }
    }
    int maxx = -1;
    for(int i = 0 ; i < cnt ; i ++)
    {
        if(fmap[1][i])
        {
            for(int j = 0 ; j < cnt ; j ++)
            {
                dp[1][i][j] = num[i];
                maxx = max(maxx , num[i]);
            }
        }
    }
    for(int i = 0 ; i < cnt ; i ++)
    {
        if(fmap[2][i])
        {
            for(int j = 0 ; j < cnt ; j ++)
            {
                if((can[i] & can[j]) == 0)
                {
                    int kk = dp[2][i][j] = num[i] + dp[1][j][j];
                    maxx = max(maxx , kk);
                }
            }
        }
    }
    for(int k = 3 ; k <= n ; k ++)
    {
        for(int i = 0 ; i < cnt ; i ++)
        {
            if(fmap[k][i])
            {
                for(int i1 = 0 ; i1 < cnt ; i1 ++)
                {
                    int nn = 0;
                    if((can[i] & can[i1]) == 0)
                    {
                        for(int i2 = 0 ; i2 < cnt ; i2 ++)
                        {
                            if(((can[i] & can[i2]) == 0) && (can[i1] & can[i2] == 0))
                            {
                                nn = max(nn , num[i] + dp[k - 1][i1][i2]);
                            }
                        }
                    }
                    dp[k][i][i1] = nn;
                    maxx = max(maxx , nn);
                }
            }
        }
    }
    printf("%d" , maxx);
    return 0;
}



回复

4 条回复,欢迎继续交流。

正在加载回复...