XueXX and Chessboard(dp)

 

题解:

本题是DP,状态转移方程是dp[i][j]=dp[i-1][j]+dp[i][j-1],只不过要加上许多判断,最后即可求出答案,要注意输入从1开始输入,并且dp[0][1]=1,这样才能使dp[1][1]赋值为1。

最后提交上去的时候一定不要忘了取模!!!

并且,dp的题也要注意边界情况,比如这题是1 1 1       1 1  这样的话就要特殊处理!!!!

AC代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <string>
#include <cassert>
#include <climits>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int INF=-1;
typedef long long ll;
typedef unsigned long long ull;
#define fi first
#define se second
#define prN printf("
")
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d%d",&(N),&(M))
#define SIII(N,M,K) scanf("%d%d%d",&(N),&(M),&(K))
#define cle(a,val) memset(a,(val),sizeof(a))
#define rep(i,b) for(int i=0;i<(b);i++)
#define Rep(i,a,b) for(int i=(a);i<=(b);i++)

int n,m,k;
int dp[1005][1005];

const int mod=1000000007;

int main()
{
    int o;
    cin>>o;
    while(o--)
    {
        cle(dp,0);
        cin>>n>>m>>k;
        int x,y;
        rep(i,k)
        {
            cin>>x>>y;
            dp[x][y]=INF;
        }
        dp[0][1]=1;
        Rep(i,1,n)
        {
            Rep(j,1,m)
            {
                if(dp[i][j]==INF)continue;

                if (dp[i-1][j]>=0&&dp[i][j-1]>=0)
                {
                    dp[i][j]+=(dp[i-1][j]+dp[i][j-1]);
                    dp[i][j]%=mod;
                }
                if (dp[i-1][j]==INF&&dp[i][j-1]==INF)
                {
                    dp[i][j]+=0;
                }
                if (dp[i-1][j]>=0&&dp[i][j-1]==INF)
                {
                    dp[i][j]+=dp[i-1][j];
                    dp[i][j]%=mod;
                }
                if (dp[i-1][j]==INF&&dp[i][j-1]>=0)
                {
                    dp[i][j]+=dp[i][j-1];
                    dp[i][j]%=mod;
                }

            }
        }
        if (dp[n][m]==INF)
            puts("0");
        else
            printf("%d
",dp[n][m]);

    }
    return 0;
}
原文地址:https://www.cnblogs.com/s1124yy/p/5520990.html