1235 -- 古明地觉的节操教育

来源:互联网 发布:专业光束灯光编程 编辑:程序博客网 时间:2024/06/08 03:48

Description

对于下述条件计算恋恋拿到礼物有几种走法。 
给一个N*M的图,恋恋起始在左上角,坐标(1,1),面向右或者面向下,礼物坐标在(X,Y),图以外的区域全是洞,图以内还有K个洞,所有在洞上的东西都会掉下去,包括道具和路标。小五现在没有道具可以使用,但是有无限个指向右的路标和无限个指向下的路标可以使用。

小五可以在任意空地上放置道具和路标,恋恋只会无意识的向前走。 
如果恋恋前面一格有路标,恋恋就会看一样路标,并往路标指的方向走。 
如果恋恋前面一格的路标的指向和恋恋的走向一样,恋恋就会无视它,并且踩过去。  
如果恋恋当前格子是洞,恋恋就会掉下去。 

Input

输入数据第一行有三个整数N、M、K、X、Y(3<=N,M<1000,0<=K<n*m,1<=x<=n,1<=y<=m)
以下有K行,每行有两个整数Xi、Yi(1<=Xi<=N,1<=Yi<=M)第i个洞的坐标为(Xi,Yi) 
数据保证每个洞和恋恋和礼物的位置均不同 

Output

输出恋恋拿到礼物的走法数mod 10007的余数

Sample Input

4 4 1 3 42 2

Sample Output

2

Hint

样例中恋恋的两种走法分别是: 
1.下下右右右 
2.右右下下右 


ps:快去台湾了,想起来还有些大一的历史问题。

动态规划,每个位置有向右,向下两种状态.状态仅向右和向下转移,检查状态转移的合法性,瞎写一下。

//#include <bits/stdc++.h>#include <cstdio>#include <iostream>#include <algorithm>typedef long long ll;typedef double db;#define rep(i,a,n) for (int i=a;i<n;i++)#define per(i,a,n) for (int i=n-1;i>=a;i--)#define mp make_pair#define pb push_back#define fi first#define se second#define all(x) (x).begin(),(x).end()#define SZ(x) ((int)(x).size())#define sspeed  ios::sync_with_stdio(false);cin.tie(0)using namespace std;const int inf = 0x3f3f3f3f;const int md = int(1e9) + 7;ll mypow(ll a,ll e){    if(e==0)return 1;    return e&1?mypow(a,e-1)*a%md:mypow(a*a%md,e>>1);}inline ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}//  headconst int mod = 10007;const int maxn =1005;int dp[maxn][maxn][2];int vi[maxn][maxn];int main() {    sspeed;    int n,m,k,x,y,xi,yi;    cin>>n>>m>>k>>x>>y;    rep(i,1,k+1) cin>>xi>>yi,vi[xi][yi] = 1;    rep(i,1,n+1) vi[i][m+1] = 1;    rep(i,1,m+1) vi[n+1][i] = 1;    //初始化状态转移    if(!vi[1][2]) dp[1][2][1] = 1;    if(!vi[2][1]) dp[2][1][0] = 1;    //0 向下 1 向右 dp[i][j][]表示达到时的该状态的方案数    rep(i,1,n+1)        rep(j,1,m+1) {            if(i == 1 && j == 1) {continue;}            if(dp[i][j][0]) {                if(!vi[i+1][j])                    dp[i+1][j][0] = (dp[i+1][j][0] + dp[i][j][0]) %mod;                if(!vi[i+1][j]&&!vi[i][j+1])                    dp[i][j+1][1] = (dp[i][j+1][1] + dp[i][j][0]) %mod;            }            if(dp[i][j][1]) {                if(!vi[i][j+1])                    dp[i][j+1][1] = (dp[i][j+1][1] + dp[i][j][1]) %mod;                if(!vi[i][j+1] && !vi[i+1][j])                    dp[i+1][j][0] = (dp[i+1][j][0] + dp[i][j][1]) %mod;            }    }    cout<<(dp[x][y][0] + dp[x][y][1]) %mod<<endl;    return 0;}


原创粉丝点击