学习DP第一步

路径计数 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;
}

加油,我可以

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值