网易雷火-游戏研发第五题

前面找规律找伤了,分享一下代码,希望好运到来🤣

思路:
和状压dp类似,先预处理出所有状态,然后dp。
AC代码:
#include <bits/stdc++.h>

using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int maxn = 2e3 + 10;
int cnt=0;
int data[2000][32];
int dp_map[15][2000][32];
ll dp[15][2000];
int w,h;
int dfs(int x,int vis[32])
{
    if(x==w)
    {
        for(int i=0;i<=30;i++)
        {
            data[cnt][i]=vis[i];
        }
        cnt++;
    }
    if(x>30)return 0;
    vis[x+2]=1;
    dfs(x+2,vis);
    vis[x+2]=0;
    vis[x+3]=1;
    dfs(x+3,vis);
    vis[x+3]=0;
    return 0;
}
int main()
{
    int ini[32];
    memset(ini,0,sizeof ini);

    cin>>w>>h;
    if(w==3||w==2)
    {
        cout<<1<<endl;
        return 0;
    }
    dfs(0,ini);
    for(int i=0;i<cnt;i++)
    {
        dp[1][i]=1;
        for(int j=0;j<31;j++)dp_map[1][i][j]=data[i][j];
    }
    for(int i=2;i<=h;i++)
    {
        for(int j=0;j<cnt;j++)
        {
            if(dp[i-1][j]==0)continue;
            for(int k=0;k<cnt;k++)
            {
                int flag=0;
                for(int p=0;p<w;p++)
                {
                    if(dp_map[i-1][j][p]==data[k][p]&&data[k][p]==1)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                {
                    dp[i][k]+=dp[i-1][j];
                    for(int p=0;p<31;p++)
                    {
                        dp_map[i][k][p]=data[k][p];
                    }
                }
            }
        }
    }
    ll ret=0;
    for(int i=0;i<cnt;i++)
    {
        ret+=dp[h][i];
    }
    cout<<ret<<endl;
    return 0;
}


#笔试题目##网易雷火#
全部评论

相关推荐

字节 后端 10k go
点赞 评论 收藏
转发
1 5 评论
分享
牛客网
牛客企业服务