题目链接:
题目翻译:
题目描述 Description
你是一只生活在笼子里的实验室老鼠。
实验室是一个R行C列的格子矩阵(1 ≤ R,C ≤ 25). 每个格子是一个笼子. (尼玛还要我活么……)
为了让你锻炼身体,实验室管理员允许你在笼子之间移动。
你只能向右和向下移动。
你不能斜着移动,也不能向上和向左移动。
你所在的笼子是实验室的左上角,标记为(1,1)
你想去右下角的笼子(R,C)里找你的女朋友(尼玛老鼠也有女盆友么!!!)
但是有一些笼子是不能经过的,因为里面有猫(谁说老鼠怕猫么,还有,管理员有毛病么……)
你女朋友很爱数学,她想要知道有多少条不同的路径可以从你的笼子到达她的笼子。写一个程序来计算吧。(这样的女朋友不要也罢……)
输入描述
第一行包含2个整数R和C,第二行一个整数K,代表包含猫的笼子的个数,接下来K行包含K个不同的位置信息,代表K个包含猫的笼子的位置信息,注意(1,1)和(R,C)这两个位置是不会有猫的, 否则出题者就没法活了……
输出描述
输出一个非负整数代表你可以去你女朋友笼子里和她啪啪啪的路径数目,你可以假设这个输出会严格小于1,000,000,000。
样例输入 Sample Input
样例输入 1:
2 3
1
2 1
样例输入 2:
3 4
3
2 3
2 1
1 4
样例输出 Sample Output
样例输出 1:
2
样例输出 2:
1
思路
就是一个较为简单的棋盘dp,转移方程:
[f[i][j]=max(f[i][j],f[i][j-1])
]
[f[i][j]=max(f[i][j],f[i-1][j])
]
[f[i][j]=f[i][j-1]+f[i-1][j]
]
为什么打不出来括号,雾~
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<stack>
#include<queue>
#include<set>
#include<map>
using namespace std;
int r,c,f[1000][1000],k,x,y;
bool is_cat[1000][1000];
int main() {
cin>>r>>c;
cin>>k;
f[1][1]=1;//注意设初值
for(int i=1; i<=k; ++i) cin>>x>>y,is_cat[x][y]=true;
for(int i=1; i<=r; ++i) {
for(int j=1; j<=c; ++j) {
if(i==1) f[i][j]=max(f[i][j],f[i][j-1]);
if(j==1) f[i][j]=max(f[i][j],f[i-1][j]);
if(i>1&&j>1) f[i][j]=f[i][j-1]+f[i-1][j];
if(is_cat[i][j]==true)//有猫不能过
f[i][j]=0;
}
}
cout<<f[r][c];
return 0;
}