[USACO06NOV]Corn Fields G
查看原帖
[USACO06NOV]Corn Fields G
525998
huangjiasheng楼主2022/5/7 22:40

萌新求助0分代码

/*****************************************
备注:
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5 + 10;
const int INF = 1e0;
int n , m ,len;
int a[N];
int dp[15][1000];
int can[N];
bool flag(int s)
{
    if(s & (s << 1)) return false;
    return true;
}
void init()
{
    for(int i = 0 ; i < (1 << m) ; i++) 
        if(flag(i))
            can[len++] = i;
}
int main()
{
    cin >> n >> m;
    init();
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = m-1 , l =0 ; l < m ; j-- , l++)
        { 
            int x;
            cin>>x;
            if(!x)
            	continue;
            a[i] += pow(2,l);
        }
    }  

    int maxx = 0;
    for(int i = 0 ; i < len ; i++) // 第一个
        if((can[i] & a[1]) == can[i])
            for(int j = 0 ; j < len ; j++)
            {
                dp[1][i] = 1;
            }
    for(int k = 3 ; k <= n ; k++)
    {
        for(int i = 0 ; i < len ; i++) // 当前
        {
            if((can[i] & a[k]) != can[i]) continue;
            for(int j = 0 ; j < len ; j++) // 上一个
            {
                if(can[i] & can[j]) continue;
                for(int l = 0 ; l < len ; l++) // 上上一个 
                {
                    if(can[i] & can[l]) continue;
                    dp[k][i] = (dp[k][i] , dp[k-1][j])%INF; 
                }
            }
        }
    }
    int sum=0;
    for(int i=1;i<len;i++)
    	sum=(sum+dp[n][i])%INF;
    cout<<sum<<endl;
    return 0;
}
2022/5/7 22:40
加载中...