• 二维状态压缩——cf903F


    题解看这个https://blog.csdn.net/u013534123/article/details/78926568

    状压的debug真的很烦

    #include<bits/stdc++.h>
    using namespace std;
    
    int mask[5][5],n,a[5],dp[1010][1<<16],b[5][2005];
    char mp[5][2005];
    /*
    15 11 7 3
    14 10 6 2
    13 9  5 1
    12 8  4 0
    */
    void premask(){
        mask[0][0]=0b1111111111111111;
        mask[0][1]=0b0111111111111111;
        
        mask[1][0]=0b1111111111111111;
        mask[1][1]=0b1011111111111111;
        mask[1][2]=0b0011001111111111;
        
        mask[2][0]=0b1111111111111111;
        mask[2][1]=0b1101111111111111;
        mask[2][2]=0b1001100111111111;
        mask[2][3]=0b0001000100011111;
        
        mask[3][0]=0b1111111111111111;
        mask[3][1]=0b1110111111111111;
        mask[3][2]=0b1100110011111111;
        mask[3][3]=0b1000100010001111;
        mask[3][4]=0b0000000000000000;
    }
    
    int main(){
        cin>>n;
        for(int i=1;i<=4;i++)cin>>a[i];
        for(int i=0;i<4;i++)scanf("%s",mp[i]);
        for(int i=0;i<4;i++)
            for(int j=0;j<n;j++)
                b[i][j]=mp[i][j]=='*'?1:0;
        
        memset(dp,0x3f,sizeof dp);
    
        
        int init=0;
        for(int j=0;j<4;j++)
            for(int i=0;i<4;i++)
                init<<=1,init|=b[i][j];
        dp[0][init]=0;
        
        premask();
        
        for(int i=0;i<n;i++){
            for(int s=0;s<(1<<16);s++){
                if(dp[i][s]==0x3f3f3f3f)continue;
                for(int l1=0;l1<=1;l1++)
                    for(int l2=0;l2<=2;l2++)
                        for(int l3=0;l3<=3;l3++)
                            for(int l4=0;l4<=4;l4++){
                                int now=s;
                                //cout<<i<<" "<<now<<'
    ';
                                now&=mask[0][l1];
                                //cout<<i<<" "<<now<<'
    ';
                                now&=mask[1][l2];
                                //cout<<i<<" "<<now<<'
    ';
                                now&=mask[2][l3];
                                //cout<<i<<" "<<now<<'
    ';
                                now&=mask[3][l4];
                                //cout<<i<<" "<<now<<'
    ';
                                //cout<<"
    ";
                                if((now>>15)&1)continue;
                                if((now>>14)&1)continue;
                                if((now>>13)&1)continue;
                                if((now>>12)&1)continue;
                                
                                int cost=a[l1]+a[l2]+a[l3]+a[l4];
                                int nxt=now;
                                for(int j=0;j<4;j++){
                                    nxt<<=1;
                                    nxt&=(1<<16)-1;
                                    nxt|=b[j][i+4];
                                }
                                dp[i+1][nxt]=min(dp[i+1][nxt],dp[i][s]+cost);
                                /*cout<<l1<<" "<<l2<<" "<<l3<<" "<<l4<<'
    ';
                                cout<<i<<" "<<s<<" "<<nxt<<"
    ";
                                cout<<dp[i][s]<<" "<<dp[i+1][nxt]<<"
    ";
                                */
                            }
            }
        }
        /*
        for(int i=0;i<n;i++){
            for(int s=0;s<(1<<16);s++)
                if(dp[i][s]!=0x3f3f3f3f)cout<<dp[i][s]<<" ";
            puts("");
        }*/
        cout<<dp[n][0]<<" ";
    }
  • 相关阅读:
    VB与SQL Server实现文件上传下载
    rszl数据表和crjsj数据表的关联查询
    网吧忘关QQ的后果
    走 近 WSH
    形容长得丑的30句经典句子
    关机VBS脚本
    C51单片机中断定义
    .NET架构的核心技术
    SQL SERVER的命令行工具Osql的用法
    七七情人节
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12292831.html
Copyright © 2020-2023  润新知