题目大意:
有一种游戏是的玩法是这样的:
有一个n*n的格子,每个格子有一个数字。
遵循以下规则:
1. 玩家每次可以由所在格子向上下左右四个方向进行直线移动,每次移动的距离不得超过m
2. 玩家一开始在第一行第一列,并且已经获得该格子的分值
3. 玩家获得每一次移动到的格子的分值
4. 玩家下一次移动到达的格子的分值要比当前玩家所在的格子的分值要大。
5. 游戏所有数字加起来也不大,保证所有数字的和不会超过int型整数的范围
6. 玩家仅能在n*n的格子内移动,超出格子边界属于非法操作
7. 当玩家不能再次移动时,游戏结束
现在问你,玩家所能获得的最大得分是多少?Input
有多组测试数据
每组测试样例第一行是两个整数n,m (1≤n≤100)(1≤m≤100),当n和m都是-1时为程序结束标志,直接退出即可
之后n行,每行n个数字,描述n*n的格子里的数字Output
对于每组测试数据输出一行,这一行仅有一个整数,代表玩家所能获得的最高得分
Sample Input
3 1 1 2 5 10 11 6 12 12 7 -1 -1
Sample Output
37
题解:
一道经典的记忆化搜索题。
状态:dp[i][j]表示从(i,j)出发的最高的分。
状态转移方程:dp[i][j]=max(dp[i][j],dp[x][y]+a[i][j]),保证能够从(i,j)到达(x,y),且(x,y)合法。
记忆化搜索比较好写,就只写了记忆化搜索的代码实现。
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N=2e3+7; int dp[N][N],a[N][N]; int n,m; int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; int dfs(int x,int y){ if(dp[x][y]!=-1) return dp[x][y]; dp[x][y]=a[x][y]; rp(i,1,m){ rp(j,0,3){ int xx=x+dir[j][0]*i; int yy=y+dir[j][1]*i; if(xx>=n+1||xx<=0||yy>=n+1||yy<=0) continue; if(a[xx][yy]<=a[x][y]) continue; dp[x][y]=max(dp[x][y],a[x][y]+dfs(xx,yy)); } } return dp[x][y]; } int main(){ while(~scanf("%d%d",&n,&m)){ if(n==-1&&m==-1) break; rp(i,1,n) rp(j,1,n) a[i][j]=read(); mst(dp,-1); dfs(1,1); printf("%d\n",dp[1][1]); } return 0; }
dp训练计划——hdu1078记忆化搜索
最新推荐文章于 2020-09-22 16:09:14 发布