zoukankan      html  css  js  c++  java
  • LeetCode 1931. Painting a Grid With Three Different Colors(DP)

    题目

    题解,动态规划
    因为m 最大只有5,所以我们可以枚举5个相邻的块,最多有多少种可能,
    然后分析每个是否能与其他几个并排,然后就是简单的BP了

    class Solution {
    public:
        int dp[50][5];
        int bp[5];
        int num[50];
        long long int ans[50];
        long long int ans2[50];
        int pat[50][50];
        int n,m;
        int p;
        const long long  int mod = 1000000007;
        int colorTheGrid(int m, int n) {
            this->n=n;
            this->m=m;
            fun(0);
           
            memset(num,0,sizeof(num));
            for(int i=0;i<p;i++)
            {
                for(int j=0;j<p;j++)
                {
                    if(j==i)
                        continue;
                   
                    bool res = true;
                    for(int k=0;k<m;k++)
                    {
                        if(dp[i][k]==dp[j][k])
                        {
                            res=false;
                            break;
                        }
                    }
                    
                    if(res)
                    {
                        pat[i][num[i]] = j;
                        num[i]++;
                    }
                }
            }
            
    
            for(int i=0;i<p;i++)
            {
                ans[i]=1;
            }
            
            for(int i=1;i<n;i++)
            {
                for(int j=0;j<p;j++)
                {
                    long long int res=0;
                    for(int k=0;k<num[j];k++)
                    {
                        res+=ans[pat[j][k]];
                        res%=mod;
                    }
              
                    ans2[j] = res;
                }
                
                for(int j=0;j<p;j++)
                {
                    ans[j]=ans2[j];
                }
            }
            
            long long int ans2=0;
            for(int i=0;i<p;i++)
            {
                ans2+=ans[i];
                ans2%=mod;
            }
            
            return ans2;
         
        }
        
        void fun(int pos)
        {
            if(pos==m)
            {
                for(int i=0;i<m;i++)
                {
                    dp[p][i] = bp[i];
                }
                p++;
                return;
            }
            
            for(int i=0;i<3;i++)
            {
                if(pos==0 || bp[pos-1] != i)
                {
                    bp[pos]=i;
                    fun(pos+1);
                }
            }
        }
    };
    
  • 相关阅读:
    HDU1312 ZOJ2165 Red and Black
    HDU1312 ZOJ2165 Red and Black
    HDU1181 变形课【DFS】
    codevs1017 乘积最大
    codevs1220 数字三角形
    codevs1169 传纸条
    codevs1219 骑士游历
    codevs1010 过河卒
    codevs1166 矩阵取数游戏
    codevs1154 能量项链
  • 原文地址:https://www.cnblogs.com/dacc123/p/15356635.html
Copyright © 2011-2022 走看看