• [LOJ#2372]「CEOI2002」臭虫集成电路公司


    CLVII.[LOJ#2372]「CEOI2002」臭虫集成电路公司

    考虑轮廓线DP。因为有 \(3\times2\) 的矩形存在,所以要压两行。又因为两行的状态只有可能是 00,01,10 之一,所以压三进制。又因为卡空间,所以要滚动数组。时间复杂度 \(O(nm3^m)\)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int T,n,m,p,f[2][10][60000],tri[11],res;
    bool bad[200][10];
    void chmx(int&x,int y){if(x<y)x=y;}
    int sta(int x,int y){return(x/tri[y])%3;}
    void solve(){
    	scanf("%d%d%d",&n,&m,&p),memset(f,-1,sizeof(f)),memset(bad,false,sizeof(bad)),res=0;
    	for(int i=1,x,y;i<=p;i++)scanf("%d%d",&x,&y),x--,y--,bad[x][y]=true;
    	int S=0;for(int i=0;i<m;i++)if(bad[0][i])S+=tri[i];
    	f[1][0][S]=0;
    	for(int i=1;i<n;i++){
    		memset(f[!(i&1)],-1,sizeof(f[!(i&1)]));
    		for(int j=0;j<m;j++)for(int k=0;k<tri[m];k++){
    			if(f[i&1][j][k]==-1)continue;
    			int now=f[i&1][j][k];
    			if(j+1<m&&i+1<n&&!bad[i][j]&&!bad[i][j+1]&&!bad[i+1][j]&&!bad[i+1][j+1]&&sta(k,j)==0&&sta(k,j+1)==0)chmx(f[(i+(j+2==m))&1][(j+2)%m][k+tri[j]*2+tri[j+1]*2],now+1);
    			if(j+2<m&&!bad[i][j]&&!bad[i][j+1]&&!bad[i][j+2]&&sta(k,j)==0&&sta(k,j+1)==0&&sta(k,j+2)==0)chmx(f[(i+(j+3==m))&1][(j+3)%m][k+tri[j]+tri[j+1]+tri[j+2]],now+1);
    			chmx(f[(i+(j+1==m))&1][(j+1)%m][(sta(k,j)>=1?k-tri[j]:k)+bad[i][j]*tri[j]],now);
    		}
    	}
    	for(int i=0;i<tri[m];i++)res=max(res,f[n&1][0][i]);
    	printf("%d\n",res);
    }
    int main(){
    	tri[0]=1;for(int i=1;i<=10;i++)tri[i]=tri[i-1]*3;
    	scanf("%d",&T);while(T--)solve();
    	return 0;
    }
    
  • 相关阅读:
    Python基础之zip和enumerate
    python3中map()函数用法
    python列表推导式
    python面试常问的几个内置装饰器:@staticmethod、@classmethod和@property
    linux的解压与压缩
    python中 s f各种转移字符含义
    fixture 调用函数名传参(转载)
    3.css选择器
    实战有感3
    实战有感2-轮播图
  • 原文地址:https://www.cnblogs.com/Troverld/p/14601811.html
Copyright © 2020-2023  润新知