zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    类加载,初始化
    jvm classLoader architecture
    只选择年份的下拉菜单
    spring框架学习(二)依赖注入
    spring框架学习(一)
    JSP 过滤器
    JSP9个内置对象
    JSP 动作元素
    众数
    基于excel9.h的excel处理
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3431336.html
Copyright © 2011-2022 走看看