• 网格图(有限制的从(1,1)到(x2,y2)刚好t单位时间的方案数)


    题:https://ac.nowcoder.com/acm/problem/16735

    分析:枚举时间。dp[i][j][k][z],代表从(1,1)到(j,k)由方式z走到的方案数,第一维记录上一次的状态

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int M=202;
    const int mod=1e9+7;
    ll dp[2][M][M][6];
    int px[]={0,0,0,1,-1};
    int py[]={0,1,-1,0,0};
    
    int main(){
        int n,m,t,x1,y1,D,x2,y2;
        scanf("%d %d %d %d %d %d %d %d",&n,&m,&t,&x1,&y1,&D,&x2,&y2);
        dp[0][1][1][0]=1;///不动为1种方案
        int cur,las;
        for(int i=1;i<=t;i++){
            cur=i&1, las=1-cur;
            for(int j=0;j<=n;j++)
                for(int k=0;k<=m;k++)
                    for(int z=0;z<5;z++)
                        dp[cur][j][k][z]=0;
            for(int j=1;j<=n;j++){
                for(int k=1;k<=m;k++)
                    for(int z=0;z<5;z++)
                        if(dp[las][j][k][z]){
                            for(int p=0;p<5;p++){
                                int tx=j+px[p];
                                int ty=k+py[p];
                                if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&(max(abs(j-x1),abs(k-y1))>D || z==0 || p==0 || z==p ))
                                    dp[cur][tx][ty][p]=(dp[cur][tx][ty][p]+dp[las][j][k][z])%mod;
                            }
                        }
            }
    
    
        }
        ll ans=0;
        for(int z=0;z<5;z++)
            ans=(ans+dp[cur][x2][y2][z])%mod;
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    nginx接收tcp请求转发server
    eclipse 配置github 提交代码
    eclipse安装JDK11
    java内存管理
    进程 线程 纤程 中断
    DCL单例为什么要加volatile
    如何清理history
    后置引用
    nc 工具使用
    ip_local_port_range 和 ip_local_reserved_ports
  • 原文地址:https://www.cnblogs.com/starve/p/13651224.html
Copyright © 2020-2023  润新知