1 6 6 4 5 6 6 4 3 2 2 3 1 7 2 1 1 4 6 2 7 5 8 4 3 9 5 7 6 6 2 1 5 3 1 1 3 7 2
3948从起始点根据能量枚举所有可能到达的点,满足 i+j<=ma[x][y] 然后路径方案保存下来。记忆化入门#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cstdio> #include <cmath> #include <deque> #include <stack> #include <map> #include <set> #define ll long long #define maxn 116 #define pp pair<int,int> #define INF 0x3f3f3f3f #define max(x,y) ( ((x) > (y)) ? (x) : (y) ) #define min(x,y) ( ((x) > (y)) ? (y) : (x) ) using namespace std; int n,m,dp[102][102],ma[102][102]; int dfs(int x,int y) { if(x==n&&y==m) return 1; if(dp[x][y]!=-1) return dp[x][y]; dp[x][y]=0; int s=ma[x][y]; for(int i=0;i<=s;i++) { for(int j=0;j<=s-i;j++) { if(x+i>=1&&x+i<=n&&y+j>=1&&y+j<=m) dp[x][y]=(dp[x][y]+dfs(x+i,y+j))%10000; } } return dp[x][y]; } int main() { int T; scanf("%d",&T); while(T--) { memset(dp,-1,sizeof(dp)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&ma[i][j]); printf("%d\n",dfs(1,1)%10000); } return 0; }
原文地址:http://blog.csdn.net/qq_16255321/article/details/41124319