hdu 1987-How many ways(dp)

解析:假设机器人在(x,y)这个点,能量为power,那么可以到达它右下角曼哈顿距离小于等于power的地方,再以该点为起点继续搜索。

代码如下:

#include<cstdio>
#include<cstring>
#include<string> #include<algorithm> #include<set> #include<map> #include<queue> #include<vector> #include<iterator> #include<utility> #include<sstream> #include<iostream> #include<cmath> #include<stack> using namespace std; const int INF=1000000007; const double eps=0.00000001; int row,col,maze[101][101]; int dp[101][101]; const int mod=10000; int dfs(int x,int y) { if(x==row-1&&y==col-1) return 1; //到达终点 int& ret=dp[x][y]; //记忆化 if(ret!=-1) return ret; ret=0; for(int stx=x;stx<=x+maze[x][y]&&stx<row;stx++) //每一行找 for(int sty=y;stx+sty<=x+y+maze[x][y]&&sty<col;sty++) //每一列 { if(stx!=x||sty!=y) //排除自己 { ret+=dfs(stx,sty); ret%=mod; } } return ret%mod; } int main() { int T; cin>>T; while(T--) { cin>>row>>col; for(int i=0;i<row;i++) for(int j=0;j<col;j++) scanf("%d",&maze[i][j]); memset(dp,-1,sizeof(dp)); int ans=dfs(0,0); cout<<ans<<endl; } return 0; } 
 
 

转载于:https://www.cnblogs.com/wust-ouyangli/p/4765507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值