6313. Maja

2023-10-20 22:59
文章标签 maja 6313

本文主要是介绍6313. Maja,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

蜜蜂 Maja 到了一片草地,草地可以被描述成 N 行 M 列的网格图,在第 i 行第 j 列的位置上有 C_{i,j} 朵未授粉的花。
Maja 会从第 A 行第 B 列出发,每次只能移动到与当前位置四相邻的格子上,且不能移动到草地以外。每到达一个格子,她会把此处所有未授粉的花都授粉。
然而,当 Maja 离开一个格子,此处又会长出 C_{i,j} 朵未授粉的花。
Maja 想知道,如果她从第 A 行第 B 列出发,选择一条长度恰好为 K 的路径,最后又回到第 A 行第 B 列,最多能为多少朵花授粉。

Input

第一行 5 个正整数 N,M,A,B,K,如题面所述(K 一定是偶数)。
接下来 N 行每行 M 个非负整数,第 i 行第 j 个表示题面所述的 C_{i,j}。
数据保证 C_{A,B}=0。

Output

一个整数,表示授粉数的最大值。

Sample Input

Sample 1:
2 2 1 1 2
0 1
2 10Sample 2:
2 2 1 1 4
0 5
5 10Sample 3:
3 3 2 2 6
5 1 0
1 0 3
1 3 3

Sample Output

Sample 1:
2Sample 2:
20Sample 3:
15

Data Constraint

Solution

先考虑一个容易发现的性质:答案一定是先走到某个点,然后来回重复走某一条路径, 最后原路返回。

对于中间重复走的路径,可以证明它的大小为 2:如果大于 2,那么假设来回走一遍路 径上所有点,点权和的平均值为 x,必然存在一条长度小于它且大于等于 2 的路径,上 述平均值大于等于 x。例如 8-5-7,来回走一遍点权和为 5+8+5+7=25,平均值为 6.25, 此时选取 8-5,来回走一遍点权和为 8+5=13,平均值为 6.5

那么可以考虑 dp:设 f[k][i][j]表示从出发点走 k 步到了(i,j)的最大点权和,然后假 设第 k 步进入重复的路径,让他走到 (i,j)四相邻的点中点权最大的一个,然后计算答 案更新全局最大值即可。Dp 第一维只需设到 min(n*m,k/2)

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define rt return
#define P(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#define N 103
using namespace std;
void rd(ll &x){x=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
}
ll a[N][N],p,n,m,A,B,K,x,y,fx[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
ll f[2][N][N],g[N][N],ans;
ll max(ll x,ll y){return x>y?x:y;}
I main(){P("maja");rd(n),rd(m),rd(A),rd(B),rd(K);F(i,1,n){F(j,1,m) rd(a[i][j]);}mem(f,-0x3f3f3f);f[0][A][B]=0;F(i,1,n){F(j,1,m){F(k,0,3){x=i+fx[k][0],y=j+fx[k][1];if(!x||!y||x>n||y>m) continue;g[i][j]=max(g[i][j],a[x][y]);	}g[i][j]+=a[i][j];}}p=0;F(k,1,min(n*m,K/2)){p=1-p;F(i,1,n){F(j,1,m){if(abs(A-i)+abs(B-j)>k) continue;F(l,0,3){x=i+fx[l][0],y=j+fx[l][1];if(!x||!y||x>n||y>m) continue;if(f[1-p][x][y]>=0) f[p][i][j]=max(f[p][i][j],f[1-p][x][y]+a[i][j]);}ans=max(ans,f[p][i][j]*2-a[i][j]+g[i][j]*(K/2-k));}}}printf("%lld\n",ans);rt 0;
}


作者:zsjzliziyang 
QQ:1634151125 
转载及修改请注明 
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/100016759

这篇关于6313. Maja的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/250268

相关文章

【JZOJ6313】Maja【dp】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/6313 一个 n × m n\times m n×m的网格图,经过点 ( x , y ) (x,y) (x,y)可以获得 a x , y a_{x,y} ax,y​的价值,一个点可以 经过多次。求从 ( x , y ) (x,y) (x,y)出发,走 p p p步后回到 ( x , y ) (x,y)

【动态规划】JZOJ_6313 Maja

题意 给出一个 n ∗ m n*m n∗m的矩阵,每个格子有些价值,走到这个格子可以获得 C i , j C_{i,j} Ci,j​点,求从起点走k步并且回到起点(a,b)的最大价值。 思路 设 f k , i , j f_{k,i,j} fk,i,j​为 k k k步时在点(i,j)获得的最大价值,40分转移显然。 可以发现一个性质,走的路是一条走过去,然后在两个点之间摩擦,再原路返回。

Maja

题目 题目描述 M a j a Maja Maja和蜜蜂在一片神奇的草地上为花授粉,这块草地可以表示为一个 n ( n ≤ 100 ) n(n\le 100) n(n≤100)行 m ( m ≤ 100 ) m(m\le 100) m(m≤100)列的矩形,在第 i i i行第 j j j列中有 C i j ( C i j ≤ 1000000000 ) C_{ij}(C_{ij}\le 100

JZOJ 6313. Maja

D e s c r i p t i o n Description Description 给定一张 n × m n\times m n×m的矩阵,第 i i i行第 j j j列的权值是 a i , j a_{i,j} ai,j​,现在要求从 ( A , B ) (A,B) (A,B)出发,走 k k k步回到原地,求最高权值和 数据范围: n , m ≤ 1 0 2 , k ≤ 1 0

UVA10182: Bee Maja (模拟)

https://vjudge.net/problem/UVA-10182   题意分析: 题意很明显,有两个蜂巢的编号方式,给出右边的,求左边的编号。 解题思路: 图中可以看出来第1层有1个,第2层有6*1=6个,第3层有6*2=12个,......第n层有6*(n-1)个。 先找出在第几层然后模拟即可。 #include <stdio.h>int px, py;void

POJ 2265 Bee Maja G++ 找规律 巧妙 背

#include <iostream>#include <cstdio>using namespace std;//英语 看博友分析 抄博友程序 找规律 巧妙 背 int main(){int a;while(cin>>a){if(a==1){cout<<0<<" "<<0<<endl;continue;}int n=0;/

POJ 2265 Bee Maja (找规律)

题目链接 题意 : 给你两个蜂巢的编号,给你一个的编号让你输出在另外一个蜂巢中对应的编号。 思路 : 先将蜂巢分层,第一层一个数,第二层6个数,第三层12个数…………然后用公式表示出第n层的最后一个数是多少,下图中竖着的是x坐标,斜着的是y坐标,往左横坐标+1,往右横坐标-1,以斜线为准往上纵坐标-1,往下纵坐标+1,(1,1)也就是18是第三圈的第一个数,(2,1)也就是20是第四圈的第一个数