HDU 1978 How many ways http://acm.hdu.edu.cn/showproblem.php?pid=1978
题意:一个N*M的矩阵,每个点内有一个整数,代表在该点所拥有的能量p,则从该点开始最多可以移动P个点(只能向下或向右移动)。问从(1,1)点到(n,m)共有多少走法。
Source Code:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=105; const int MOD=10000; long long map[maxn][maxn],sum[maxn][maxn]; int n,m; bool OK(int x,int y){ if(x>0&&x<=n&&y>0&&y<=m) return true; return false; } long long DFS(int x,int y){ if(x==n&&y==m) return 1; if(sum[x][y]>-1) return sum[x][y]; long long stp=0; for(int i=0;i<=map[x][y];i++) for(int j=0;j<=map[x][y]-i;j++) if(OK(x+i,y+j)&&(i+j>0)) stp=(stp+DFS(x+i,y+j))%MOD; sum[x][y]=stp; return stp; } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%I64d",&map[i][j]); memset(sum,-1,sizeof(sum)); printf("%I64d\n",DFS(1,1)); } return 0; }
HDU 1078 FatMouse and Cheese http://acm.hdu.edu.cn/showproblem.php?pid=1078
题意:在一个N*N的矩阵,老鼠可以横向或纵向从一个格子移动到另一个格子,每到一个格子便得到一定的食物,但最远只能移动到第k个格子,且每次移动只能移动到食物比该格子内食物多的格子。问从(1,1)格子出发可以得到多少食物。
Source Code:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <queue> #include <map> #include <set> #define LL long long #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int inf=0x3f3f3f3f; const int MOD=10000; const int maxn=105; int maze[maxn][maxn]; LL sum[maxn][maxn]; int n,k; bool OK(int x,int y){ if(x>=0&&x<n&&y>=0&&y<n) return true; return false; } int dfs(int x,int y){ if(sum[x][y]>-1) return sum[x][y]; int cnt=0; for(int i=0;i<=k;i++){ if(OK(x+i,y)&&maze[x+i][y]>maze[x][y]) cnt=dfs(x+i,y); if(cnt>sum[x][y]) sum[x][y]=cnt; } for(int i=0;i<=k;i++){ if(OK(x-i,y)&&maze[x-i][y]>maze[x][y]) cnt=dfs(x-i,y); if(cnt>sum[x][y]) sum[x][y]=cnt; } for(int i=0;i<=k;i++){ if(OK(x,y+i)&&maze[x][y+i]>maze[x][y]) cnt=dfs(x,y+i); if(cnt>sum[x][y]) sum[x][y]=cnt; } for(int i=0;i<=k;i++){ if(OK(x,y-i)&&maze[x][y-i]>maze[x][y]) cnt=dfs(x,y-i); if(cnt>sum[x][y]) sum[x][y]=cnt; } sum[x][y]+=maze[x][y]; return sum[x][y]; } int main() { while(scanf("%d %d",&n,&k)==2){ if(n==-1&&k==-1) break; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) scanf("%d",&maze[i][j]); } memset(sum,-1,sizeof(sum)); printf("%d\n",dfs(0,0)); } return 0; }