【CSP-S膜你考】那23个路口
2019-10-25 06:24:33来源:博客园 阅读 ()
【CSP-S膜你考】那23个路口
那23个路口
题面
故事的起源不加赘述,那23个路口。
单刀直入,我直接说题的意思。
蚊子和疯子在做一件事,就是他们要在茫茫的大街上找一个出发点,然后从出发点开始,经过上下左右23次拐弯,到达一个他们也不知道的地方。
老城的街道排列的十分有规律,于是疯子和蚊子把老城的街道排布画在了一张地图上。地图上每一个点代表一个地方,而这个地方有一定的憧憬值,疯子希望可以带蚊子走过的二十三个路口的憧憬值总和是所有方案中最大的。
现在我们读入一个矩阵,如果此点为0,则这个点为起点,如果此点为-1,则这个点为障碍点,否则这个数代表憧憬值。注意起点和障碍点是没有憧憬值的,起点只有开始的时候可以达到,不可以再回来。而障碍点根本就不可以走过。这样一来,请你选择合适的路线,使走完23个路口后得到最大的憧憬值,有憧憬值的点可以重复进出,每次可以选择四个方向,上下左右。起点为第0个路口
输入格式
第1行两个整数 n,m (茫茫大街的长和宽)
第2行到第m+1行,每行n个整数$A_{ij}$(第I行第j个地点的憧憬值)
输出格式
一个整数sum (可以得到的最大憧憬值)
样例
$\texttt{input#1}$
4 4
1 1 1 1
1 1 0 1
1 1 1 1
1 1 1 1
$\texttt{output#1}$
23
数据范围与提示
于30%的数据,$n,m \leqslant 50$
0<n,m<300,每个点的憧憬值可以用longint表示。
题解
dp。f[i][j][k]表示第k步走到(i,j)这个位置的最大憧憬值.则有,
if(map[i][j]<=0) continue;
if(j>1&&map[i][j-1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j-1][k-1]+map[i][j]);
if(j<m&&map[i][j+1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j+1][k-1]+map[i][j]);
if(i>1&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]+map[i][j]);
if(i<n&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i+1][j][k-1]+map[i][j]);
$Code$
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define max(a,b) a>b?a:b
#define MAXN 301
typedef long long ll;
int n,m;
ll f[MAXN][MAXN][24],map[MAXN][MAXN],ans;
inline void read(ll &T) {
ll x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
T=f?-x:x;
}
int main() {
scanf("%d%d",&m,&n);
memset(f,-0x3f3f3f,sizeof(f));
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
read(map[i][j]);
if(map[i][j]==0) f[i][j][0]=0;
}
}
for(int k=1;k<=23;++k) {
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
if(map[i][j]<=0) continue;
if(j>1&&map[i][j-1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j-1][k-1]+map[i][j]);
if(j<m&&map[i][j+1]>=0) f[i][j][k]=max(f[i][j][k],f[i][j+1][k-1]+map[i][j]);
if(i>1&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]+map[i][j]);
if(i<n&&map[i-1][j]>=0) f[i][j][k]=max(f[i][j][k],f[i+1][j][k-1]+map[i][j]);
}
}
}
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) {
if(ans<f[i][j][23]) ans=f[i][j][23];
}
}
std::cout<<ans<<'\n';
return 0;
}
上接【CSP-S膜你考】不怕噩梦 (模拟)
原文链接:https://www.cnblogs.com/poi-bolg-poi/p/11713384.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 【CSP-S膜你考】 A 2019-10-17
- 【CSP-S膜你考】即时战略(模拟) 2019-10-17
- 【CSP-S膜你考】最近公共祖先 To Be Continued 2019-10-12
- c#研发和使用中的23个技巧_c#教程 2008-02-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash