网格图(有限制的从(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\n",ans);
    return 0;
}
View Code

 

posted @ 2020-09-11 13:27  starve_to_death  阅读(149)  评论(0编辑  收藏  举报