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;
}