zoukankan      html  css  js  c++  java
  • poj 3254 Corn Fields 夜

    http://poj.org/problem?id=3254

    poj 你又亮了 我感觉时间复杂度这么高的程序 你居然让我 0ms 过了

    无语了

    给你矩阵 有的地方可以种植 有的地方不可以

    种植位置不可相邻 问最多有多少种  种法

    最多宽度为12 把其中一维 的种不种 转化为 对应位 的二进制1 或0

    让后更新就可以了

    代码及其注释:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<cmath>
    #include<stack>
    #include<algorithm>
    
    using namespace std;
    
    const int mod=100000000;
    const int N=15;
    
    int fertile[N][N];//土地是否肥沃
    int sum[N][1<<12];//第几 行  把列的种类用二进制对应起来
    bool Can(int i,int k,int m)//第i行 为k 是能不能种
    {
        int pre=0;
        for(int j=1;j<=m&&k;++j,k=k/2)
        {
            if(fertile[i][j]==0&&k%2==1)//种的地方土地必须肥沃
            return false;
            if(k%2==1&&pre==1)//不能有相邻 1
            return false;
            pre=k%2;
        }
        return true;
    }
    int main()
    {
       int n,m;
       while(scanf("%d %d",&n,&m)!=EOF)
       {
           memset(fertile,0,sizeof(fertile));
           for(int i=1;i<=n;++i)
           {
               for(int j=1;j<=m;++j)
               {
                   scanf("%d",&fertile[i][j]);
               }
           }
           memset(sum,0,sizeof(sum));
           int ans=0;
           int M=1<<m;
           for(int i=1;i<=n;++i)
           {
               for(int j=0;j<M;++j)
               {
                   if(Can(i,j,m))
                   {
                       if(i==1)
                       sum[i][j]=1;
                       else
                       {
                           for(int l=0;l<M;++l)
                           {
                               if((j&l)==0)//可以累加
                               {
                                   sum[i][j]=(sum[i][j]+sum[i-1][l])%mod;
                               }
                           }
                       }
                       if(i==n)
                       {
                           ans=(ans+sum[i][j])%mod;
                       }
                   }
               }
           }
           printf("%d\n",ans);
       }
       return 0;
    }
    

      

  • 相关阅读:
    用 Flask 来写个轻博客
    Django 博客开发教程目录索引
    动态规划问题
    Java课程目录
    React&Vue
    Node.js
    Chrome Input框老是有输入记录的终极解决方案
    php中&运算符的理解与使用
    服务器压测、并发数、配置与资源消耗的关系研究
    定时任务被执行两遍,如何处理?
  • 原文地址:https://www.cnblogs.com/liulangye/p/2601301.html
Copyright © 2011-2022 走看看