JZOJ 6313. Maja

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

本文主要是介绍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 9 n,m\leq 10^2,k\leq 10^9 n,m102,k109


S o l u t i o n Solution Solution

结论1:路径一定是走到某个点再返回【显然】
结论2:路径一定在某处循环
结论3:循环节长度为2

复杂度: O ( n 2 m 2 ) O(n^2m^2) O(n2m2)


C o d e Code Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define N 110
using namespace std;int n,m,A,B;
long long f[2][N][N],a[N][N],ans,K,w[N][N];
const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
signed main()
{freopen("maja.in","r",stdin);freopen("maja.out","w",stdout);memset(f,0xcf,sizeof(f));scanf("%d%d%d%d%lld",&n,&m,&A,&B,&K);for(register int i=1;i<=n;i++)for(register int j=1;j<=m;j++)scanf("%lld",a[i]+j);f[0][A][B]=0;K/=2;for(register int k=1;k<=min(1ll*n*m,K);k++){memset(f[k&1],0xcf,sizeof(f[k&1]));for(register int i=1;i<=n;i++)for(register int j=1;j<=m;j++){if(k==1){for(register int l=0;l<4;l++) w[i][j]=max(w[i][j],a[i+dx[l]][j+dy[l]]);w[i][j]+=a[i][j];}for(register int l=0;l<4;l++)f[k&1][i][j]=max(f[k&1][i][j],f[~k&1][i+dx[l]][j+dy[l]]+a[i][j]);if(f[k&1][i][j]<0) continue;ans=max(ans,(f[k&1][i][j]+(K-k)/2*w[i][j])*2-a[i][j]);}}printf("%lld",ans);
}

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



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

相关文章

Jzoj 条件循环(while,do while) 部分代码(共25题)

1020: 【入门】编程求1+3+5+...+n #include <bits/stdc++.h>using namespace std;int n, sum;int main() {scanf("%d", &n);for(int i=1; i<=n; i+=2){sum+=i;} printf("%d", sum);return 0;} 1012: 【入门】两数比大小 #i

Jzoj 二维数组部分代码(共13题)

2788: 【入门】二维数组的输入输出 边输入边输出 #include <bits/stdc++.h>using namespace std;int n, m, a[11][11];int main(){scanf("%d %d", &n, &m);//边输入边输出for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){scanf("%d", &

jzoj 5770 可爱精灵宝贝

题目 题解 –是区间dp(好像dfs加神秘玄学剪枝也能过?) 首先,我们可以发现这个人走过的位置是一个区域,而且区域内部的精灵要么被抓,要么消失了(总之就是与以后的转移没有关系) 所以,状态定义: f[l][r][t] :当这个人走过区间[l,r],且目前在l处,时间为t时的最大分值 注意,l,r的左右位置要根据大小自己判断 然后我们又发现,现在这个人只有两种方法:左走或右走

[离散化][区间DP]JZOJ 5770 可爱精灵宝贝

日常黑Pokeman Go Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家。最近,他闲得没事组织了一场捉精灵的游戏。游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n。 刚开始玩家在k号房子前。有m个精灵,第i只精灵在第A[i]栋房子前,分值是B[i],以及它在T[i]秒内(含)存在,之后消失。Branimirko可以选择移动至相邻的房子,耗时

[权值线段树]JZOJ 3236 矮人排队

Description 在七山七海之外的一个小村庄,白雪公主与N个矮人住在一起,所有时间都花在吃和玩League of Legend游戏。白雪公主决心终结这样的生活,所以为他们举办了体育课。 在每节课开始时,矮人必须按他们的身高站队。假定矮人们有高度1,2,...,N(每个人高度互不相同)。然而,由于不健康的生活方式,矮人的智力有所恶化,所以他们没有能力依照自己的高度排序。 因此,白雪公主发

JZOJ 1495. 宝石(附加扫描线讲解)

JZOJ 1495. 宝石 题目大意:给你N个 ( K + 1 ) × ( K + 1 ) (K+1)\times(K+1) (K+1)×(K+1)的正方形以及他们左上角的那个顶点的坐标和它的权值,求最大的覆盖的权值。 这一题可以用二维前缀和做,但是无法拿到满分。 满分做法:扫描线。 假如现在有这么两个长方形,权值都为1(不要问为什么是长方形,这里只是为了方便讲解而已),它们摆放如图: 首

【JZOJ A组】 大逃杀

Description 自从 Y 君退役之后,她就迷上了吃鸡,于是她决定出一道吃鸡的题。 Y 君将地图上的所有地点标号为 1 到 n,地图中有 n − 1 条双向道路连接这些点,通过一条 双向道路需要一定时间,保证从任意一个点可以通过道路到达地图上的所有点。 有些点上可能有资源,Y 君到达一个有资源的点后,可以选择获取资源来使自己的武力值增 加 wi,也可以选择不获取资源。如果 Y 君获取了

[数位dp][斯特林反演] Jzoj P5765 相互再归的鹅妈妈

Description Input Output Sample Input Input 13 1101Input 24 310Input 35 1001 Sample Output Output 11Output 21978Output 3598192244 Data Constraint 对于所有数据,保证

#线段树#JZOJ 1959 最大值

线段树 #include <cstdio>#include <cctype>#include <climits>#include <algorithm>using namespace std;struct node{int w;}tree[400001]; int a[100001],n,m,ans;inline int in(){int ans=0,f=1; char c=getc

#欧拉函数#jzoj 1709 洛谷 2158 仪仗队

题目 求C君一次能看到多少人。 分析: 首先3个点是绝对看得到的(1,0),(0,1),(1,1) 然后从第三行开始为 φ ( n − 1 ) \varphi(n-1) φ(n−1)把它们加起来*2+3便是答案。 代码 #include <cstdio>using namespace std;unsigned short n,phi[40001]; int ans;int