Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1654 Accepted Submission(s): 1016

点,当他到达(2,4)点时将拥有1单位的能量,并开始下一次路径选择,直到到达(6,6)点。 我们的问题是机器人有多少种方式从起点走到终点。这可能是一个很大的数,输出的结果对10000取模。
记忆化搜索+DP..
题目中“他将只有终点所标记的能量”是解题的关键啊!一开始还老想剩余能量怎么处理.....悲剧。
这题可以分为两种DP方式,一种是当前的这个点可以到达其他点的方法数和能到达当前点的方法数。。
两种状态转移方程也差不多。
下面分别是两种方法的AC代码
1,
#include<stdio.h> #include<string.h> const int maxn=120; int n,m; int map[maxn][maxn]; int dp[maxn][maxn]; int min(int a,int b){ return a<b?a:b; } int DFS(int x,int y,int k){ if(x==n && y==m) return 1; if(dp[x][y]!=0) return dp[x][y]; for(int i=0;i<=min(k,n-x);i++) for(int j=0;j<=min(k-i,m-y);j++){ if(i==0 && j==0) continue; dp[x][y]+=DFS(x+i,y+j,map[x+i][y+j]); dp[x][y]%=10000; } return dp[x][y]; } int main(){ //freopen("input.txt","r",stdin); int t; scanf("%d",&t); while(t--){ memset(map,0,sizeof(map)); memset(dp,0,sizeof(dp)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); DFS(1,1,map[1][1]); printf("%d\n",dp[1][1]); } return 0; }
2,
#include<stdio.h> #include<string.h> int dp[120][120]; int main(){ //freopen("input.txt","r",stdin); int t,n,m; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); dp[0][0]=1; int num; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ scanf("%d",&num); for(int x=0;x<=num;x++) for(int y=0;y<=num-x;y++){ if(x==0 && y==0) continue; dp[i+x][j+y]=(dp[i+x][j+y]+dp[i][j])%10000; } } printf("%d\n",dp[n-1][m-1]); } return 0; }