大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
FatMouse and Cheese
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10863 Accepted Submission(s): 4625
FatMouse begins by standing at location (0,0). He eats up the cheese where he stands and then runs either horizontally or vertically to another location. The problem is that there is a super Cat named Top Killer sitting near his hole, so each time he can run at most k locations to get into the hole before being caught by Top Killer. What is worse — after eating up the cheese at one location, FatMouse gets fatter. So in order to gain enough energy for his next run, he has to run to a location which have more blocks of cheese than those that were at the current hole.
Given n, k, and the number of blocks of cheese at each grid location, compute the maximum amount of cheese FatMouse can eat before being unable to move.
a line containing two integers between 1 and 100: n and k
n lines, each with n numbers: the first line contains the number of blocks of cheese at locations (0,0) (0,1) … (0,n-1); the next line contains the number of blocks of cheese at locations (1,0), (1,1), … (1,n-1), and so on.
The input ends with a pair of -1’s.
3 1 1 2 5 10 11 6 12 12 7 -1 -1
37
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn =105;
int a[maxn][maxn],dp[maxn][maxn];
int n,k;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int dfs(int x, int y){
int tmp=0;
for (int j=1;j<=k;j++){
for (int i=0;i<4;i++){
int xx=x+dx[i]*j; //k步是水平或竖直的
int yy=y+dy[i]*j;
if (xx<0 || yy<0 || xx>=n || yy>=n) continue;
if (a[x][y]>=a[xx][yy]) continue;
if (dp[xx][yy]) { //如果已经探索过了,就没必要继续深搜了
tmp=max(tmp,dp[xx][yy]); //取最大值
continue;
}
tmp=max(tmp,dfs(xx,yy)); //取所有方案中的最大值
}
}
return dp[x][y]=a[x][y]+tmp;
}
int main(){
std::ios::sync_with_stdio(false); //提高cin输入效率
while (cin >> n >> k){
if (n==-1 && k == -1) break;
for (int i=0;i<n;i++){
for (int j=0;j<n;j++) cin>>a[i][j];
}
memset(dp,0,sizeof(dp));
cout<<dfs(0,0)<<endl; //最优解在出发点上
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164447.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...