• hdu 2167(状态压缩基础题)


    题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取!

    分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是这个题目的输入确实让我很无语,开始的时候wa一次,后来改成了超时,最后还是参照别人的输入ac的!

    代码实现:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    int n,map[20][20],dp[2][(1<<15)+10];
    int a[20000],num;
    
    void chushihua()
    {
        int i,max=1<<15;
        for(i=0; i<max; i++)
            if((i&(i<<1))==0)
                a[num++]=i;
    }
    
    int qiu(int r,int flag)
    {
        int i,sum=0,x=1<<(n-1);
        for(i=1; i<=n; i++)
        {
            if((flag&x)!=0)
                sum=sum+map[r][i];
            x=x>>1;
        }
        return sum;
    }
    
    void solve()
    {
        int res=0,i,j,k,p=0,max,temp;
        max=1<<n;
        memset(dp,0,sizeof(dp));
        for(i=1; i<=n; i++)
        {
            p=p^1;
            memset(dp[p],0,sizeof(dp[p]));
            for(j=0; j<num&&a[j]<max; j++)
            {
                temp=qiu(i,a[j]);
                for(k=0; k<num&&a[k]<max; k++)
                {
                    if(((a[j]&a[k])==0)&&(((a[j]<<1)&a[k])==0)&&(((a[j]>>1)&a[k])==0))
                    {
                        if(dp[p][a[j]]<(temp+dp[1-p][a[k]]))
                            dp[p][a[j]]=temp+dp[1-p][a[k]];
                        if(res<dp[p][a[j]])
                            res=dp[p][a[j]];
                    }
                }
            }
        }
        printf("%d
    ",res);
    }
    
    int main()
    {
        char ch[1000],temp;
        num=0;
        chushihua();
        while(gets(ch))
        {
            int i , j ;
            i = 0 ;
            do
            {
                if(ch[0] == 0)    break ;
                int len = strlen(ch);
                j = 0 ;
                i++ ;
                for(int c=0; c<len; c++)
                {
                    if(ch[c] == ' ')    continue ;
                    j++ ;
                    map[i][j] = 10*(ch[c]-'0') + ch[c+1]-'0' ;
                    c++ ;
                }
            }
            while(gets(ch)!=NULL) ;
            n = i ;
            solve();
        }
        return 0;
    }
  • 相关阅读:
    springboot集成kafka
    elasticsearch http 搜索 测试
    linux下安装Elasticsearch
    laravel_admin 使用
    laravel 数据操作
    Win10+apache+PHP+Mysql
    laravel 坑(一)
    下载CentOS镜像
    window10 家庭版 添加Hyper-V虚拟机
    Win10 Composer 下载安装
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3431336.html
Copyright © 2020-2023  润新知