路径计数 DP
题目描述
一个N \times NN×N的网格,你一开始在(1,1)(1,1),即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N)(N,N),即右下角有多少种方法。
但是这个问题太简单了,所以现在有MM个格子上有障碍,即不能走到这MM个格子上。
输入格式
输入文件第11行包含两个非负整数N,MN,M,表示了网格的边长与障碍数。
接下来MM行,每行两个不大于NN的正整数x, yx,y。表示坐标(x, y)(x,y)上有障碍不能通过,且有1≤x, y≤n1≤x,y≤n,且x, yx,y至少有一个大于11,并请注意障碍坐标有可能相同。
输出格式
一个非负整数,为答案\bmod 100003mod100003后的结果。
输入输出样例
输入 #1复制
3 1
3 1
输出 #1复制
5
说明/提示
对于20%20%的数据,有N≤3N≤3;
对于40%40%的数据,有N≤100N≤100;
对于40%40%的数据,有M=0M=0;
对于100%100%的数据,有N≤1000,M≤100000N≤1000,M≤100000。
思路:定义dp[][]含义
DP方程: dp[i][j]=dp[i-1][j]+dp[i][j-1]
注意插入的点f[x][y]是不能走的点,需要进行判断
#include <bits/stdc++.h>
using namespace std;
bool f[2000][2000];
unsigned long long dp[2000][2000];
int main(){
int n,m,i,j,x,y;
cin>>n>>m;
dp[1][1]=1;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
f[i][j]=true;
}
}
for(i=1;i<=m;i++){
cin>>x>>y;
f[x][y]=false;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(f[i][j]==false||i==1&&j==1){
continue;
}
if(i==1&&f[i][j]==true){
dp[i][j]=dp[i][j-1]%100003;
}else if(j==1&&f[i][j]==true){
dp[i][j]=dp[i-1][j]%100003;
}else{
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%100003;
}
}
}
cout<<dp[n][n];
return 0;
}
加油,我可以