本文主要是介绍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,m≤102,k≤109
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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!